Изпълнете код, преди да създадете документ в mongoengine

Как мога да изпълня някакъв код само когато документ е създаден в mongoengine, а не когато се актуализира.

class Account(Document):
    name = StringField(max_length=80, default=None)
    username = StringField(max_length=60, required=True)
    created_at = DateTimeField(default=datetime.now(), required=True)
    updated_at = DateTimeField(default=datetime.now(), required=True)

    meta = {
        'collection': 'accounts'
    }

Сега искам да генерирам произволно потребителско име и да го присвоя на полето за потребителско име, преди да бъде създаден документ.

Всяка помощ се оценява. Благодаря.


person Rohit Khatri    schedule 19.12.2016    source източник


Отговори (1)


Трябва да използвате един от сигналите на MongoEngine - pre_save() звучи като подходящо. Тук има различни начини за прикачване на манипулатор на събитие към сигнал е един от тях:

from mongoengine import signals

class Account(Document):
    # ...

    @classmethod
    def pre_save(cls, sender, document, **kwargs):
        document.username = "random username"

signals.pre_save.connect(Account.pre_save, sender=Account)
person alecxe    schedule 19.12.2016
comment
Мисля, че pre_save също се извиква по време на актуализиране и не искам да изпълнявам кода си всеки път, когато документът е запазен, само веднъж, когато е създаден. - person Rohit Khatri; 19.12.2016
comment
@RohitKhatri ах, разбрах..тогава pre_init() може да е подходящо. - person alecxe; 19.12.2016
comment
как мога да осъществя достъп до полетата на документа в манипулатора на сигнала pre_init, защото когато се опитам да осъществя достъп до името на свойството на документа, извежда грешка AttributeError: _data - person Rohit Khatri; 19.12.2016
comment
@RohitKhatri Аз лично не съм използвал pre_init() преди и очаквах настройката на полетата чрез document.field да работи..добре, можеш ли да опиташ с post_init()? Благодаря. - person alecxe; 19.12.2016
comment
Постигнах това с помощта на post_init и изпълних кода си, ако document.id е None - person Rohit Khatri; 19.12.2016