4


3

Djangoの多くのモデルに共通のdate_added、date_modifiedを追加する最良の方法

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

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)

or

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が初めてで、どちらのアプローチがより「ジャンゴ」なのか疑問に思いました。 どちらがより効率的ですか? これを行う「正しい」方法はどれですか?

4 Answer


4


「DateTimeField」の「auto_now = True」と「auto_now_add = True」を見てみましたか? 必要なことを自動的に行います。 それ以外の場合、保存のオーバーライドと信号処理の間に実際の違いはありません。実際、pre_save信号はdjangoモデルのsaveメソッドから呼び出されています。

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


4


Djangoを初めて使用するので、Djangoコマンド拡張機能が便利な場合があります。

  1. これには、TimeStampedModelが含まれています。 からのモデル:

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


2


これらをhttp://docs.djangoproject.com/en/dev/topics/db/models/#id6[Abstract Base Class]で定義してから継承できます。 モデルフィールドも定義するMixInを持っているようなものです。


1


auto_now_add`と auto_now`は pre_save`を使用することに注意してください。これらは bulk_create`または `update`のときは機能しません。 したがって、MySQLでは、たとえば、date_addedフィールドは「0000-00-00 00:00:00」となり、「警告:列「date_added」をnullにすることはできません」という警告を受け取ることができます。 したがって、auto_now *を使用できますが、注意が必要です。