Как да актуализирате автоматично времето за актуализиране в MongoEngine?

Има някои колекции, които създадох с помощта на flask-mongoEngine. Например като автор, книга, компания. Същата част е, че имат 2 файла с имена

created_at = db.DateTimeField(required=True, default=utcnow())
updated_at = db.DateTimeField(required=True, default=utcnow())

Всеки път, когато създавам нов документ, трябва да актуализирам стойността на created_at и updated_at, също така, когато актуализирам документа, трябва да актуализирам стойността на updated_at. Има ли добър начин, когато правя операция save(), тези полета за време могат да се актуализират автоматично?


person McCree Feng    schedule 30.03.2020    source източник


Отговори (1)


Задаването на стойностите по подразбиране да бъдат utcnow() със скобите кара Python да изпълнява функцията utcnow, когато се създава класът, а не когато се създава нов обект, използващ този клас. Вместо това трябва да зададете по подразбиране функцията без (). Това ще предаде самата функция като обект, вместо да я извика веднага, и когато се създаде нов обект от този клас, функцията ще се изпълни.

Освен това документите на Python препоръчват използването на datetime.now над utcnow. В съответствие с това вашият пример трябва да изглежда така:

import datetime

class Example(mongoengine.Document):
    created_at = db.DateTimeField(required=True, default=datetime.datetime.now)
    updated_at = db.DateTimeField(required=True, default=datetime.datetime.now)

Що се отнася до актуализирането на атрибута updated_at всеки път, когато извиквате save(), можете да създадете функция за обвивка за save(), която ще зададе updated_at на datetime.now(), след което ще запази. След това, вместо да извиквате save(), извиквайте вашата функция за обвивка, когато искате да запишете.

Функцията за обвивка е функция, която извършва малка предварителна обработка и след това извиква друга функция (вижте wikipedia: https://docs.python.org/3/library/datetime.html).

Например, вие пишете функция като тази:

def my_save(object):
    object.updated_at = datetime.datetime.now()
    return object.save()

И тогава всеки път, когато искате да запазите обект, вие извиквате my_save() вместо object.save().

person pythko    schedule 21.04.2020
comment
Как мога да създам обвивка и използване? Ако е възможно, можете ли да споделите примера? - person Suresh; 05.02.2021
comment
Актуализирах публикацията си с повече информация относно функциите на обвивката. - person pythko; 13.02.2021