我正在尝试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()
或者如果有更好,更好的方式.
您可以覆盖save方法.
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)
另外,创建时间标记在_id
属性中 - 如果您这样做:
YourObject.id.generation_time
会给你一个日期时间戳.
一个不错的解决方案是将单个信号处理程序重新用于多个文档。
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
)也总是更好。