web-dev-qa-db-ja.com

Django 1.8にアップグレードした後の「修正されたデフォルト値」

Django 1.8にはモデルの問題検出機能がいくつかあります。しかし、それが私に与えている警告の1つとして、私は問題を理解していますが、それが私に与えているヒントがどのように優れているかは理解できません。

これは私の(悪い)モデルフィールドです:

my_date = DateField(default=datetime.now())

それがなぜ悪いのかは簡単にわかります。しかし、これは私に与えているヒントです:

MyMoel.my_date:(fields.W161)提供されている固定のデフォルト値。
ヒント:このフィールドのデフォルトとして、固定された日付/時刻/日時の値を設定したようです。これはあなたが望むものではないかもしれません。現在の日付をデフォルトにしたい場合は、 `Django.utils.timezone.now`を使用します

だから、それはtimezone.nowを使用すると書かれていますが、それはdatetime.nowより優れているのでしょうか?それらはboth "fixed default" values ... timezone.now just returns datetime instance、which is a fixed value ...

「use timezone.nowlater "」というようなフラグを実際に挿入する必要があるのではないかと思います。しかし、それはヒントが言うことではありません...それで、その旗は何ですか?

27
Troy

関数datetime.now()は現在、コードがインポートされるとすぐに、つまりサーバーを(再)起動したときに実行されます。後続のすべてのモデルインスタンスは同じ値になります。

代わりに、呼び出し可能な関数をdefaultに渡す必要があります。これは、モデルインスタンスがデフォルト値を必要とするたびに実行されます。ヒントは、括弧なしで文字どおりDateField(default=Django.utils.timezone.now)を使用する必要があることを伝えます。

メッセージは少し誤解を招くかもしれませんが、Djangoはdatetime.now()を使用したかDjango.utils.timezone.now()を使用したかを知りません。

65
knbk