5 votes

Mettre à jour un champ DateTime dans Mongoengine avec auto_now_add

J'essaie de faire une fourchette de MongoEngine qui permettra la mise à jour automatique d'un DateTimeField basé sur le passage de True à un auto_now o auto_now_add ( à la Django ).

Jusqu'à présent, j'ai ajouté les attributs à l'élément __init__ méthode de DateTimeField comme suit :

def __init__(self, auto_now=None, auto_now_add=None, **kwargs):
    self.auto_now, self.auto_now_add = auto_now, auto_now_add
    super(DateTimeField, self).__init__(**kwargs)

Malheureusement, je n'arrive pas à trouver comment remplir cette valeur proprement lorsqu'un document est créé/enregistré. La seule solution que je vois jusqu'à présent est d'ajouter un comportement spécifique au champ dans les méthodes de sauvegarde ou de validation de BaseDocument... Mais je n'aime pas ça.

Quelqu'un connaît-il une meilleure méthode ?

A ce propos : J'ai eu l'idée de faire un essai après avoir lu cette question et @ équinoxe sur l'extension de mongo et l'habitude de cet attribut dans django.

17voto

Ross Points 7813

Vous pourriez ajouter un signal de pré-enregistrement et mettre à jour la date du document avant l'enregistrement.

class MyDoc(Document):
    name = StringField()
    updated_at = DateTimeField(default=datetime.datetime.now)

    @classmethod
    def pre_save(cls, sender, document, **kwargs):
        document.updated_at = datetime.datetime.now()

signals.pre_save.connect(MyDoc.pre_save, sender=MyDoc)

Le principal problème est qu'ils ne seront pas mis à jour si vous appelez. update ou si vous effectuez des mises à jour en masse, par exemple : MyDocs.objects.update(set__name=X)

Ajout d'un ticket : https://github.com/MongoEngine/mongoengine/issues/110

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X