33

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()

または、より良い、より良い方法がある場合。

4

9 に答える 9

74

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)
于 2011-11-15T21:34:54.803 に答える
27

余談ですが、作成時間は_id属性にスタンプされます。

YourObject.id.generation_time

日時スタンプをお付けします。

于 2012-07-17T06:43:30.993 に答える
6

優れた解決策の1つは、単一のシグナルハンドラーを複数のドキュメントに再利用することです。

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、アプリが最初に読み込まれた時間に新しいドキュメントが常に設定される原因になります。

また、データベースに(datetime.utcnowではなくdatetime.now)UTC日付を保存することをお勧めします。

于 2013-01-09T21:49:24.363 に答える
4
# -*- coding: utf-8 -*-
from mongoengine import *
from mongoengine import signals
from datetime import datetime

class User(Document):
    email = StringField(required=True, unique=True)
    first_name = StringField(max_length=50)
    last_name = StringField(max_length=50)
    # audit fields
    created_on = DateTimeField(default=datetime.now())
    updated_on = DateTimeField(default=datetime.now())

    @classmethod
    def pre_save(cls, sender, document, **kwargs):
        document.updated_on = datetime.now()

signals.pre_save.connect(User.pre_save, sender=User)
于 2012-08-07T18:19:56.003 に答える
4

私の推奨する解決策は、@propertyデコレーターを使用して、ObjectId から抽出された作成日時を返すことです。

@property
def creation_stamp(self):
    return self.id.generation_time
于 2014-11-07T14:49:01.750 に答える
0

伝統的に、creation_dateデフォルトを に設定してからdatetime.now()、管理フォームのフィールドを非表示にして、ユーザーが正しい値を上書きする可能性を排除しました。コードはほとんど必要ありません。

Willian によって提案されているように save メソッドをオーバーライドすることも効果的です。プログラムで への更新をブロックし、同時にcreation_dateを更新できるからです。modfied_date

于 2011-11-18T17:34:15.103 に答える
-8

ドキュメントに従って auto_now_add パラメータを使用できます。

class MyModel(mongoengine.Document):
    creation_date = mongo.DateTimeField(auto_now_add = True)
    modified_date = mongo.DateTimeField(auto_now = True)
于 2011-11-18T15:12:36.187 に答える