Django : Contourner l’option auto_now et auto_now_add
Ces options concernent les champs DateField et DateTimeField des modèles django. Typiquement, cela permet d’obtenir des timestamps de création et de dernière modification de l’objet. Il n’est pas possible de les définir manuellement, lorsqu’un objet est créé puis enregistré en base via sa méthode save(), les champs utilisant ces options prendront pour valeur la date courante quelle que soit la valeur spécifiée pour l’attribut.
Note that the current date is always used; it’s not just a default value that you can override.
C’est parfait pour l’usage normal de ces champs, mais gênant lorsque par exemple on importe les données d’une application existante via un script dédié (voir la création de commandes) utilisant la couche modèle.
Pour contourner cet écueil, j’ai tout simplement enregistré mes objets une première fois via save(), puis une seconde fois via la méthode update de leur queryset en filtrant sur la clef primaire.
obj = MyModel() obj.save() MyModel.objects.filter(pk=obj.pk).update(created=value, updated=value) |
Ce n’est certes pas très optimisé question performances, mais m’économise de créer les objets directement en SQL.
2 Responses to Django : Contourner l’option auto_now et auto_now_add
Projets
- Budjinn.com Gestion de budgets en ligne
- django-noaccount Une application Django découplant le concept d’utilisateur de celui de compte d’accès.
- django-pagecontents Un module de CMS pour vos applications Django
- Tapuscrits.com Un editeur de textes longs / structurés en ligne
- Webappkit Mon framework / système de paquets pour PHP





Tu peux aussi désactiver l’option avant de sauver, dans ton script.
Quelque chose genre (et idem avec auto_now_add) :
for field in obj._meta.fields:
if getattr(field, “auto_now”, True):
field.auto_now = False
Ah oui, mieux, merci