2013-06-13 2 views
15

У меня есть QuerySet как:преобразование даты и времени поля в строку в Джанго queryset.values_list()

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

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

+0

вы упускаете 'квартира = true' – karthikr

ответ

13

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 = ноябрь)? – dietbacon

+0

@ dietbacon вы пробовали 'now.strftime ('% B')'? –

3

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

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 (выберите = {'datestr': "DATE_FORMAT (activ_date, '%% Y - %% m - %% d')"}) '' – user2002692

0

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

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

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'