Обновить поле DateTime в mongoengine с помощью функции auto now add


Я пытаюсь сделать вилку из MongoEngine , которая позволит автоматически обновлять DateTimeField на основе передачи True в auto_now или auto_now_add (a la Django ).

До сих пор я добавлял атрибуты к __init__ методу DateTimeField примерно так:

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)

К сожалению, я не могу понять, как заполнить это значение чисто, когда документ создается / сохраняется. Единственное решение, которое я вижу до сих пор, - это добавление специфичного поведения поля в методы сохранения или проверки BaseDocument... Но мне это не нравится.

Кто-нибудь знает лучший метод?

Кстати: я подумал о том, чтобы пойти на это после прочтения этого вопроса и комментария @ equinoxel о расширении mongo и использовании этого атрибута в django.

1 3

1 ответ:

Вы можете добавить сигнал предварительного сохранения и обновить дату документа перед сохранением.

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)

Основные проблемы с этим-они не будут обновлены, если вы вызовете update или если вы делаете массовые обновления, например: MyDocs.objects.update(set__name=X)

Добавлен билет: https://github.com/MongoEngine/mongoengine/issues/110