Преобразование datetime Поле в строку в django queryset.values_list() - программирование
Подтвердить что ты не робот

Преобразование datetime Поле в строку в django queryset.values_list()

У меня есть запрос, например:

qs = MyModel.objects.filter(name='me').values_list('activation_date')

здесь activation_date DateTimeField в моделях. Когда я загружаю лист excel из этого qs, я не получаю дату активации в формате .. Как я могу преобразовать это поле ('activation_date') в строку или как его можно преобразовать в qs?

4b9b3361

Ответ 1

https://docs.djangoproject.com/en/2.2/ref/models/fields/#datetimefield

Дата и время, представленные в Python экземпляром datetime.datetime.

Вы можете получить строковое представление DateTimeField, приводящего его напрямую:

str(obj)
# obj = qs[0][0] ? or qs[0][1] ?

Вы получите такой результат (в этом примере я использую datetime.datetime.now(), поскольку DateTimeField представлен datetime.datetime - то же самое поведение):

>>> now = datetime.datetime.now()
>>> str(now)
'2013-06-26 00:14:26.260524'

если вы хотите меньше информации или отформатированы в другом режиме, вы можете использовать функцию strftime() для их форматирования. увидеть:

>>> now.strftime('%Y-%m-%d %H:%M')
'2013-06-26 00:14'

Ответ 2

Если вы используете Postgres, вы можете сделать это следующим образом (параметры формата даты здесь). Решение зависит от базы данных, но после выполнения запроса оно наверняка превосходит циклы, хотя и длинный список в Python.

qs = MyModel.objects.filter(name='me')
qs = qs.extra(select={'datestr':"to_char(activation_date, 'YYYY-MM-DD HH24:MI:SS')"})
qs = qs.values_list('datestr')

Я уверен, что MySQL имеет некоторую эквивалентную функцию как Postgres to_char, но вы должны будете найти это самостоятельно, поскольку я не парень MySQL.

Ответ 3

extra устарел в Django 2.0

Вот почему я считаю, что лучшим решением для получения строкового datetime является:

foo_bar = FooBarModel.objects.annotate(
    str_datetime=Cast(
        TruncSecond('some_datetime_field', DateTimeField()), CharField()
    )
).values('str_datetime').first()

Результат:

foo_bar.str_datetime:
(str)'2014-03-28 15:36:55'

Также я хотел бы упомянуть, что вы можете отформатировать его так, как хотите:

from django.db.models import Value

foo_bar = FooBarModel.objects.annotate(
    day=Cast(ExtractDay('some_datetime_field'), CharField()),
    hour=Cast(ExtractHour('some_datetime_field'), CharField()),
    str_datetime=Concat(
        Value('Days: '), 'day', Value(' Hours: '), 'hour', 
        output_field=CharField()
    )
).values('str_datetime').first()

Результат:

foo_bar.str_datetime:
(str)'Days: 28 Hours: 15'

Ответ 4

qs = MyModel.objects.filter(name='me')
qs = qs.extra(select={'datestr':"DATE_FORMAT(activation_date, '%Y-%m-%d')"})
qs = qs.values_list('datestr')

Ответ 5

Вы также можете преобразовать дату в строке запроса в строку с помощью функции map. Пример:

qs = MyModel.objects.filter(name='me').values_list('activation_date', flat=True)
data = map(str, qs)

Ответ 6

Я сделал это так

.annotate(date_str=ExpressionWrapper(
            Func(F('date'), Value('%d/%m/%Y %H:%i'), function='DATE_FORMAT'), output_field=CharField()
        ))