web-dev-qa-db-ja.com

Django default = timezone.now()は「古い」時間を使用してレコードを保存します

この問題は数週間オンとオフで発生しており、私のプロジェクトで発生したものとは異なります。

使用される2つのモデルには、デフォルトでtimezone.now()に設定されているタイムスタンプフィールドがあります。

これは、エラーフラグを立てるシーケンスです。


  • モデル1は午後7時30分に作成されます

  • モデル2は午後10時に作成されますが、MySQLデータベースには午後7時30分として保存されます。

作成されるすべてのモデルのタイムスタンプは、特定の期間が経過するまで、実際の時間ではなく、午後7時30分未満に保存されます。次に、新しい時間が設定され、次のすべてのモデルにその新しい時間があります... Bizzare


問題の発見に役立つ可能性のあるいくつかの追加の詳細:

タイムゾーンからtzinfoを取り除き、UTCに置き換えるために使用するメソッドがたくさんあります。

これは、timezone.now() - creationTime計算を実行して、プロジェクトに「モデルはこれよりずっと前に投稿されました」という機能を作成しているためです。ただし、これが問題の原因になることはありません。

datetime.datetime.now()を使用しても違いはないと思います。

とにかく、助けてくれてありがとう!

18
Lucas Ou-Yang

先週、default=date.today()のあるフィールドに遭遇しました。括弧を削除すると(この場合はdefault=timezone.nowを試してください)、呼び出し可能オブジェクトをモデルに渡し、新しいインスタンスが保存されるたびに呼び出されます。括弧を使用すると、models.pyがロードされたときに1回だけ呼び出されます。

50
Jamey Sharp

パラメータauto_now_addをこのように設定するだけです。

timestamp = models.DateTimeField(auto_now_add=True)

更新:

auto_now_addは使用しないでください。これは推奨される方法ではなく、代わりに次のようにします。

from Django.utils import timezone

timestamp = models.DateTimeField(default=timezone.now)
10
Rag Sagar