it-swarm.com.de

Umwandlung von datetime Field in String in Django queryset.values_list ()

Ich habe ein Abfrageset wie:

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

hier activation_date ist DateTimeField in Modellen. Wenn ich eine Excel-Datei von dieser Qs herunterlade, erhalte ich kein Aktivierungsdatum in Zeichenfolgenformat Wie kann ich dieses Feld ('Aktivierungsdatum') in eine Zeichenfolge konvertieren oder wie kann ich es in Qs typisieren?

24
Navera

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

Ein Datum und eine Uhrzeit, die in Python durch eine datetime.datetime-Instanz dargestellt werden.

Sie können eine Zeichenfolgendarstellung eines DateTimeField-Castings direkt abrufen:

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

Sie erhalten das folgende Ergebnis (in diesem Beispiel verwende ich datetime.datetime.now (), da ein DateTimeField durch datetime.datetime dargestellt wird und dasselbe Verhalten aufweist):

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

wenn Sie weniger Informationen benötigen oder in einem anderen Modus formatieren möchten, können Sie sie mit der Funktion strftime () formatieren. sehen:

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

extra ist veraltet in Django 2.

Aus diesem Grund denke ich, ist die beste Lösung, um eine stringierte Datumszeit zu erhalten:

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

Das Ergebnis ist:

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

Außerdem möchte ich erwähnen, dass Sie es auch so formatieren können, wie Sie es möchten:

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

Das Ergebnis ist:

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

Wenn Sie Postgres verwenden, können Sie dies folgendermaßen tun ( Datumsformatoptionen hier ). Die Lösung ist datenbankabhängig, aber es ist sicher besser, eine lange Liste in Python land zu durchlaufen, nachdem Sie die Abfrage durchgeführt haben.

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

Ich bin mir sicher, dass MySQL eine ähnliche Funktion wie to_char von Postgres hat, aber das müssen Sie selbst herausfinden, da ich kein MySQL-Typ bin.

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

Ich habe es so gemacht

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

Sie können das Datum im Queryset auch mit der Funktion map in einen String konvertieren. Beispiel:

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