web-dev-qa-db-fra.com

conversion du champ datetime en chaîne en Django queryset.values_list ()

J'ai un ensemble de requêtes comme:

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

ici activation_date est DateTimeField dans les modèles. Lorsque je télécharge la feuille Excel à partir de ce qs, je ne reçois pas la date d'activation en format de chaîne. Comment puis-je convertir ce champ ('activation_date') en chaîne ou comment le transcrire en qs?

24
Navera

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

Une date et une heure, représentées en Python par une instance datetime.datetime.

Vous pouvez obtenir une représentation sous forme de chaîne d'un champ DateTimeField directement:

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

Vous obtiendrez un résultat comme celui-ci (dans cet exemple, j'utilise datetime.datetime.now () car un DateTimeField est représenté par datetime.datetime est le même comportement):

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

si vous voulez moins d'informations ou formaté dans un autre mode, vous pouvez utiliser la fonction strftime () pour les formater. voir:

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

extra est déconseillé dans Django 2.

C'est pourquoi je pense que la meilleure solution pour obtenir un datetime stratifié est:

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

Le résultat est:

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

Je voudrais également mentionner que vous pouvez également le formater comme vous le souhaitez:

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

Le résultat est:

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

Si vous utilisez Postgres, vous pouvez le faire comme ceci ( options de format de date ici ). La solution dépend de la base de données, mais elle bat certainement en boucle à travers une longue liste dans Python atterrit après avoir effectué la requête.

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

Je suis sûr que MySQL a une fonction équivalente à to_char de Postgres, mais vous devrez le trouver par vous-même car je ne suis pas un gars MySQL.

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

Je l'ai fait de cette façon

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

Vous pouvez également convertir la date du jeu de requêtes en chaîne à l'aide de la fonction map. Exemple:

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