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?
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'
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'
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.
qs = MyModel.objects.filter(name='me')
qs = qs.extra(select={'datestr':"DATE_FORMAT(activation_date, '%Y-%m-%d')"})
qs = qs.values_list('datestr')
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()
))
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)