преобразование поля даты / времени в строку в django queryset.values_list ()

У меня есть такой набор запросов:

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

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

 karthikr10 июл. 2013 г., 06:26
вам не хватаетflat=True

Ответы на вопрос(5)

вы можете сделать это так (параметры формата даты здесь). Решение зависит от базы данных, но после выполнения запроса оно наверняка превосходит циклы, хотя и длинный список в 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 's to_char, но выЯ должен найти это самостоятельно, потому что я не парень MySQL.

extra устарела в Django 2.0

Тот'Вот почему я думаю, что лучшее решение для получения строковой даты:

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'
 Aurélien02 июл. 2018 г., 10:54
Первые строки кода дают мне: django.db.utils.OperationalError: near "Никто": ошибка синтаксиса
 Bobort09 мая 2018 г., 00:10
Нет,extra не осуждается в Django 2.0. Я использую это даже сам. Они не установили крайний срок его амортизации.docs.djangoproject.com/en/2.0/ref/models/querysets/#extra
 Aurélien04 июл. 2018 г., 14:36
@MrCyberthrone это действительно странно, потому что этот код выглядит хорошо для меня. Но если вы попробовали это, появится сообщение об ошибке:User.objects.all().annotate(year=Cast(ExtractYear('date_joined'), CharField()),month=Cast(ExtractMonth('date_joined'), CharField()),day=Cast(ExtractDay('date_joined'), CharField()),str_datetime=Concat('day', Value(' / '), 'month', Value(' / '), 'year', output_field=CharField())).values('str_datetime').first()  возвращает:sqlite3.OperationalError: near "None": syntax error
 Eugene Kovalev04 июл. 2018 г., 14:44
@ Ауразалоговое удержание, пожалуйста, посмотрите наi.imgur.com/gM9uveE.png  Я вставил ваш код, и он прекрасно работает. Может быть, проблема в Sqlite3. Я'Я использую MySQL. Если вы обнаружили проблему, пожалуйста, дайте мне знать. Тот'интересно
 Aurélien04 июл. 2018 г., 15:34
К вашему сведению, я создал вопрос об этом:stackoverflow.com/questions/51174993/...
 Eugene Kovalev02 июл. 2018 г., 17:08
@ Ауразалоговое удержание это странно. Ты имеешь ввидуfoo_bar = FooBarModel.objects.annotate неверное утверждение?
 Aurélien04 июл. 2018 г., 14:57
@MrCyberthrone, я примеряю базу данных Postgres, и это сообщение:imgur.com/a/pnV65JL
 Eugene Kovalev04 июл. 2018 г., 15:08
@ Ауразалоговое удержание хм. Не могли бы вы предоставить файл с дампом пользователей, чтобы я мог его проверить? Наряду с используемой версией Django и их импортом,ConcatValueи т. д. Возможно, указан неверный путь импорта
 Aurélien04 июл. 2018 г., 15:14
Это мой импортfrom django.db.models import Value, CharField    from django.db.models.functions import Cast, Concat, ExtractDay, ExtractMonth, ExtractYear   Использование версии 1.11.4
qs = MyModel.objects.filter(name='me')
qs = qs.extra(select={'datestr':"DATE_FORMAT(activation_date, '%Y-%m-%d')"})
qs = qs.values_list('datestr')
 user200269213 мая 2017 г., 21:40
вторая строка должна быть:qs = qs.extra(select={'datestr':"DATE_FORMAT(activation_date, '%%Y-%%m-%%d')"})

https://docs.djangoproject.com/en/dev/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'
 Victor Aurélio18 авг. 2015 г., 21:22
@dietbacon ты пробовал?now.strftime('%B')
 dietbacon29 июн. 2015 г., 11:24
Есть ли способ получить месяц непосредственно в текстовом времени (например, 11 = ноябрь)?

используяmap функция. Пример:

qs = MyModel.objects.filter(name='me').values_list('activation_date', flat=True)
data = map(str, qs)
 Mauricio Cortazar26 авг. 2018 г., 06:58
Это не масштабируется с большими запросами

Ваш ответ на вопрос