30

タイムゾーン管理が Django 1.4 に追加されたので、問題はまったく新しいものだと思います。

単純なモデルを使用しました

class Sample(models.Model):
    ...
    date_generated = models.DateTimeField(auto_now_add = True)

新しく作成されたレコードを取得しようとすると失敗します。

min_datetime = datetime.now() - timedelta(seconds = 300)
sample = Sample.objects.get(date_generated__gte = min_datetime)

サーバーは警告を発行します。

DateTimeField received a naive DateTime (2012-06-29 15:02:15.074000) while time zone support is active.

その問題に対する2つの解決策を見つけました。

  1. settings.py でタイムゾーン管理を無効にする

     USE_TZ = False 
    

しかし、これは常に望ましいとは限りません。2.変化する

    date_generated = models.DateTimeField(auto_now_add = True) 

    date_generated = models.DateTimeField(default=datetime.now()) 

タイムゾーン管理を機能させ続けるソリューションです

4

3 に答える 3

23

問題はあなたの側にあります: あなたdatetime.now()は TZ を認識していないので、素朴な TZ を食べているのはあなたです。この問題については、Django のドキュメントを参照してください。設定時に機能する理由default=datetime.nowは、値を単純な日時に強制しているためです。後で別の単純な日時と比較しても問題ありません。

次の方法で「今」を取得する必要があります。

import datetime
from django.utils.timezone import utc

now = datetime.datetime.utcnow().replace(tzinfo=utc)
于 2012-06-29T14:31:30.310 に答える
9

Apache/nginx が Django をロードするとき (または開発サーバーを起動するとき) に単一の値を計算し、後続のすべてのレコードがその値を受け取るため、のDateTimeFieldデフォルト値を慎重に設定してください。datetime.now()

auto_now_addという理由でいつも使っています。

于 2013-10-21T17:45:32.890 に答える