2013-06-13 12 views
15

Mam queryset jak:konwersja datetime Pole ciąg w Django queryset.values_list()

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

tutaj activation_date jest DateTimeField w modelach. Po pobraniu arkusza programu Excel z tego pliku qs nie otrzymuję daty aktywacji w formacie ciągu znaków . Jak mogę przekonwertować to pole ("activation_date") w łańcuchu lub jak go wpisać w qs?

+0

brakuje 'płaski = TRUE – karthikr

Odpowiedz

13

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

datę i czas, przedstawiony na Pythonie przez datetime.datetime przykład.

można uzyskać ciąg znaków reprezentujący DateTimeField rzucając go bezpośrednio:

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

Otrzymasz spowodować tak (w tym przykładzie używam datetime.datetime.now(), ponieważ jest DateTimeField reprezentowane przez datetime.datetime jest takie samo zachowanie):

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

jeśli chcesz mniej informacji lub sformatowana w innym trybie można użyć strftime() funkcję formacie im. patrz:

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

Czy istnieje jakiś sposób, aby uzyskać miesiąc bezpośrednio w czasie tekstowym (np 11 = listopad)? – dietbacon

+0

@dietbacon próbowałeś 'now.strftime ('% B')'? –

3

Jeśli używasz PostgreSQL, można to zrobić tak (date format options here). Rozwiązanie zależy od bazy danych, ale na pewno bije z pętli na długiej liście w Pythonie po wykonaniu kwerendy.

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') 

Jestem pewien MySQL ma pewne równoważną funkcję co to_char Postgres, ale trzeba będzie znaleźć na własną rękę, jak nie jestem facet 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

Druga linia powinna być: '' qs = qs.extra (select = {'datestr': "DATE_FORMAT (data_aktywacji, '%% Y - %% m - %% d')"}) '' – user2002692

0

Można również przekonwertować datę w zapytaniu na ciąg znaków przy użyciu funkcji map. Przykład:

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

extra jest przestarzała Django 2.0

Dlatego myślę, że najlepszym rozwiązaniem, aby uzyskać stringified datetime jest:

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

Rezultatem jest:

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

Również chciałbym wspomnieć możesz go sformatować w dowolny sposób:

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() 

Rezultatem jest:

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