4

現在のプロジェクトの一般的なモデルの束に、date_added フィールドと date_modified フィールドを追加しています。models.Model をサブクラス化し、適切なフィールドを追加していますが、自動保存動作を追加したいと考えています (つまり、誰かが MyModel.save() を呼び出すたびに、date_modified フィールドが更新されます。2 つの方法があります: save() メソッドをオーバーライドするまたは、抽象基本クラスに pre_save シグナル ハンドラーを追加します。

class CommonData(models.Model):
    date_added = models.DateTimeField(default=datetime.datetime.today,null=False,blank=False)
    date_modified = models.DateTimeField(default=datetime.datetime.today,null=True,blank=True)

    # register a handler for the pre_save to update date_modified
    def pre_save_handler(sender, **kwargs):
        date_modified = datetime.datetime.today

    def __init__():
        pre_save.connect(pre_save_handler, sender=self)

また

class CommonData(models.Model):
    date_added = models.DateTimeField(default=datetime.datetime.today,null=False,blank=False)
    date_modified = models.DateTimeField(default=datetime.datetime.today,null=True,blank=True)

    # overriding save 
    def save(force_insert=False,force_update=False):
        date_modified = datetime.datetime.now
        return models.Model.save(force_insert, force_update)

私は Django と Python が初めてで、どのアプローチがより「django」であるか疑問に思いましたか? どちらがより効率的ですか? これを行う「正しい」方法はどれですか?

4

4 に答える 4

4

と を見てみましたかDateTimeField?必要なことだけを自動的に行います。それ以外の場合、上書き保存とシグナル処理の間に実際の違いはありません。実際、 pre_save シグナルは django モデルの save メソッドから呼び出されています。auto_now=Trueauto_now_add=True

ドキュメント: http://docs.djangoproject.com/en/dev/ref/models/fields/#datefield

于 2009-12-24T19:02:17.030 に答える
4

Django を初めて使用する場合は、Django コマンド拡張機能が役立つことがあります。

http://code.google.com/p/django-command-extensions/

...これには、モデルを派生できる TimeStampedModel が便利に含まれています。

http://code.google.com/p/django-command-extensions/wiki/ModelExtensions

自己管理の「作成」および「変更」フィールドを提供する抽象基本クラス モデル。

于 2009-12-24T22:23:53.287 に答える
2

これらを抽象基本クラスで定義し、そこから継承できます。モデル フィールドも定義する MixIn があるようなものです。

于 2009-12-24T18:35:22.370 に答える
1

auto_now_addと をauto_now使用することに注意してください。これは、またはpre_saveの場合には機能しません。たとえば、MySQL では、date_added フィールドが '0000-00-00 00:00:00' になり、次の警告が表示される可能性があります: 'Warning: Column 'date_added' cannot be null'. したがって、auto_now* を使用できますが、注意が必要です。bulk_createupdate

于 2013-01-22T08:43:10.747 に答える