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

14

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

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

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

  • 0
    вы пропали без вести flat=True
Теги:
django-models
python-2.7

5 ответов

12

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'
  • 1
    Есть ли способ получить месяц прямо в текстовом времени (например, 11 = ноябрь)?
  • 0
    @dietbacon вы пробовали now.strftime('%B') ?
3
qs = MyModel.objects.filter(name='me')
qs = qs.extra(select={'datestr':"DATE_FORMAT(activation_date, '%Y-%m-%d')"})
qs = qs.values_list('datestr')
  • 0
    вторая строка должна быть: qs = qs.extra(select={'datestr':"DATE_FORMAT(activation_date, '%%Y-%%m-%%d')"})
3

Если вы используете 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.

0

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'
  • 1
    Нет, в Django 2.0 extra не рекомендуется. Я использую это даже сам. Они не установили крайний срок его амортизации. docs.djangoproject.com/en/2.0/ref/models/querysets/#extra
  • 0
    Первые строки кода дают мне: django.db.utils.OperationalError: около "None": синтаксическая ошибка
Показать ещё 7 комментариев
0

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

qs = MyModel.objects.filter(name='me').values_list('activation_date', flat=True)
data = map(str, qs)
  • 0
    Это не масштабируется с большими запросами

Ещё вопросы

Сообщество Overcoder
Наверх
Меню