Djangoモデルフォームオブジェクトの自動作成日?


153

オブジェクトの作成日を自動的に設定し、オブジェクトが最後に更新されたときに記録するフィールドを設定する最良の方法は何ですか?

models.py:

created_at = models.DateTimeField(False, True, editable=False)
updated_at = models.DateTimeField(True, True, editable=False)

views.py:

if request.method == 'POST':
    form = MyForm(request.POST)
    if form.is_valid():
        obj = form.save(commit=False)
        obj.user = request.user
        obj.save()
        return HttpResponseRedirect('obj_list')

エラーが発生します:

objects_object.created_at may not be NULL

この値を自分で手動で設定する必要がありますか?それが渡されたパラメータのポイントだと思いましたDateTimeField(または単にデフォルトであり、設定editable=Falseしたのでフォームに表示されないため、リクエストで送信されず、したがって取得されませんフォームに入れますか?)

これを行う最良の方法は何ですか?__init__方法?

回答:


311

あなたは使用することができるauto_nowauto_now_addするためのオプションをupdated_atしてcreated_at、それぞれ。

class MyModel(models.Model):
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

31
auto_nowauto_now_add考えられているので、それらを避けてください。この回答は、理由を説明し、save()メソッドをオーバーライドしてより良いアプローチを提供します。
gregoltsov 2014年

3
それは、このエラーを生成しますYou are trying to add a non-nullable field 'created_at' to gameuser without a default; we can't do that (the database needs something to populate existing rows). Please select a fix: 1) Provide a one-off default now (will be set on all existing rows) 2) Quit, and let me add a default in models.py Select an option: 1 Please enter the default value now, as valid Python The datetime and django.utils.timezone modules are available, so you can do e.g. timezone.now() >>> timezone.now()
Kaleem Ullah

1
データベースの行を削除するか、オプション1をチェックしてtimezone.now()を追加します
mullerivan

オプションを選択してください:1有効なPythonとしてデフォルト値を今すぐ​​入力してくださいdatetimeおよびdjango.utils.timezoneモジュールが使用できるため、たとえば、timezone.now()>>> timezone.now()を実行できます 'aml_validations'の移行:
mullerivan 2017年


26

さて、上記の答えは正しいです。auto_now_addauto_nowはそれを行いますが、抽象クラスを作成し、必要なフィールドcreated_atupdated_atフィールドがあるモデルでそれを使用する方が良いでしょう。

class TimeStampMixin(models.Model):
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    class Meta:
        abstract = True

これで、どこでもそれを使用したい場合は、単純な継承を行うことができ、好きなように作成したモデルでタイムスタンプを使用できます。

class Posts(TimeStampMixin):
    name = models.CharField(max_length=50)
    ...
    ...

このようにして、Django DRYでオブジェクト指向の再利用性を活用できます(自分で繰り返さないでください)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.