Mongoengine文档中的creation_time属性
我想在我的文档里添加一个叫做 creation_time
的属性。下面是一个例子:
import datetime
class MyModel(mongoengine.Document):
creation_date = mongo.DateTimeField()
modified_date = mongo.DateTimeField(default=datetime.datetime.now)
Django 的模型有一些内置的参数,比如 DateTimeField
对象的 add_now
等等,但 MongoEngine 并不支持这些。
我在想,最好的做法是不是下面这样:
m,created = MyModel.objects.get_or_create()
if created:
m.creation_date = datetime.datetime.now()
或者有没有更好、更简单的方法。
9 个回答
6
一个不错的解决方案是为多个文档重用一个信号处理器。
class User(Document):
# other fields...
created_at = DateTimeField(required=True, default=datetime.utcnow)
updated_at = DateTimeField(required=True)
class Post(Document):
# other fields...
created_at = DateTimeField(required=True, default=datetime.utcnow)
updated_at = DateTimeField(required=True)
def update_timestamp(sender, document, **kwargs):
document.updated_at = datetime.utcnow()
signals.pre_save.connect(update_timestamp, sender=User)
signals.pre_save.connect(update_timestamp, sender=Post)
要注意,默认值要设置为可调用的函数,而不是固定的值,比如 default=datetime.utcnow
时不要加 ()
。这个页面上的一些其他回答是不正确的,会导致新文档的 created_at
时间总是设置为你应用第一次加载的时间。
而且,最好在数据库中存储UTC时间(使用 datetime.utcnow
而不是 datetime.now
)。
28
顺便提一下,创建时间会被记录在 _id
属性里。如果你执行以下代码:
YourObject.id.generation_time
这会给你一个日期和时间的标记。
76
你可以重写保存的方法。
class MyModel(mongoengine.Document):
creation_date = mongo.DateTimeField()
modified_date = mongo.DateTimeField(default=datetime.datetime.now)
def save(self, *args, **kwargs):
if not self.creation_date:
self.creation_date = datetime.datetime.now()
self.modified_date = datetime.datetime.now()
return super(MyModel, self).save(*args, **kwargs)