Document中的Mongoengine creation_time属性

jos*_*iti 29 python django orm mongodb mongoengine

我正在尝试creation_time向我的文档添加属性.以下是一个例子:

import datetime

class MyModel(mongoengine.Document):
    creation_date = mongo.DateTimeField()
    modified_date = mongo.DateTimeField(default=datetime.datetime.now)
Run Code Online (Sandbox Code Playgroud)

Django模型为它们的DateTimeField对象构建了参数,例如add_now,等等,但是MongoEngine不支持这个.

我想知道这样做的最佳方法如下:

m,created = MyModel.objects.get_or_create()
if created:
    m.creation_date = datetime.datetime.now()
Run Code Online (Sandbox Code Playgroud)

或者如果有更好,更好的方式.

Wil*_*ian 61

您可以覆盖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)
Run Code Online (Sandbox Code Playgroud)


Ben*_*hes 21

另外,创建时间标记在_id属性中 - 如果您这样做:

YourObject.id.generation_time
Run Code Online (Sandbox Code Playgroud)

会给你一个日期时间戳.

  • 这比接受的答案要好.我在这样的函数上使用`@ property`来获取created_time:`def created_at(self):如果self.id,则返回self.id.generation_time无 (2认同)

小智 5

一个不错的解决方案是将单个信号处理程序重新用于多个文档。

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)
Run Code Online (Sandbox Code Playgroud)

请小心分配可调用而不是固定值作为默认值,例如, default=datetime.utcnow不带()。此页面上的其他一些答案不正确,可能会导致created_at新文档始终设置为首次加载应用程序的时间。

在数据库中存储UTC日期(datetime.utcnow而不是datetime.now)也总是更好。