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.

Tagged with:
 

2 Responses to Django : Contourner l’option auto_now et auto_now_add

  1. Yohan says:

    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

  2. Jérémie Ducastel says:

    Ah oui, mieux, merci :)

Set your Twitter account name in your settings to use the TwitterBar Section.