2017-07-24 2 views
0

J'ai une longue liste d'entrées qui ont un champComment régler uniquement l'heure pour un DateTimeField django utilisant la mise à jour

date=models.DateTimeField(default=timezone.now)

Cette utilisation sur le terrain pour être un DateField seulement et maintenant je l'ai changé à datetime . Après la migration, les entrées existantes ont l'heure par défaut définie sur midgnig (00). Je voudrais mettre à jour cela pour toutes les entrées à 9 heures.

Je voudrais quelque chose comme ceci:

Entry.objects.all().update(date__hour=9)

mais cela ne fonctionne pas comme il soulève et exception:

django.core.exceptions.FieldDoesNotExist: entrée n'a pas de champ nommé « date__hour '

Des suggestions? Merci

EDIT 1: la liste des entrées est grande, supérieure à 1 million d'entrées. Par conséquent je voudrais une mise à jour de masse de base de données, pas une solution par un.

Répondre

2

Je n'ai aucun projet pour le moment. Mais pouvez-vous essayer comme ça.

for e in Entry.objects.all(): 
    e.date += timedelta(0, 9*3600) 
    e.save() 

Ce qui précède fonctionnera comme vous avez 00 dans heures chaque objet. Mais si vous voulez remplacer statiquement l'objet date avec 9 AM qui a une valeur différente dans chaque objet date. Vous pouvez faire comme ci-dessous.

for e in Entry.objects.all(): 
    e.date = e.date.replace(hour=9) 
    e.save() 

Espérons que ce sera votre problème.

+0

Merci. Cela fonctionnerait et je connais cette solution, mais je cherche une mise à jour de niveau de base de données (mise à jour de masse). Le nombre d'entrées est important (plus de 1 million) et cela prendrait trop. J'ai mis à jour ma question pour être plus précis. – Vlad

+0

Je ne pense pas que vous ayez une autre solution directement avec ORM. Peut-être devez-vous utiliser une requête SQL brute. BTW Je crois que cela prendra en même temps ce que d'autres approches avec ORM (Jusqu'à ce que vous n'alliez pas avec la requête SQL) – Swagat