2012-06-29 11 views
18

タイムゾーン管理がdjango 1.4に追加されたと仮定して、問題は全く新しいものです。djangoタイムゾーンがmodel.fieldのauto_now_addとどのように動作するのですか

私はそのに障害が発生し、新しく作成されたレコードを取得しようとすると、私は単純なモデル

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 
    

    で無効にタイムゾーンの管理が、これは常にdesierableではありません。あなたの終わりにされ

答えて

17

問題を作業時間帯の管理保つソリューションです

date_generated = models.DateTimeField(auto_now_add = True) 

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

  • 変更:datetime.now()を意識TZされていないが、あなたは素朴なTZに餌を与えています。 Django docs on this issueを参照してください。 default=datetime.nowを設定するときに動作する理由は、値を単純なdatetimeに強制しているため、後で他の単純なdatetimeと比較しても問題ありません。ときにApache/nginxの負荷ジャンゴ(またはときに起動することが単一の値を計算しますと

    import datetime 
    from django.utils.timezone import utc 
    
    now = datetime.datetime.utcnow().replace(tzinfo=utc) 
    
  • +6

    私はこの平均値をauto_nowを使用するか、私は真のUSE_TZ =を持っている場合auto_now_addすることはできませんでしょうか? – dannyroa

    +5

    'auto_now'と' auto_now_add'は本質的に 'datetime.now'を使用しているようです。 DjangoにDZを認識させる機能をDjangoに挿入するのは、Djangoの部分では奇妙なことですが、このかなり重要なものは見逃していますが、この2つのkwargの運命は長い間議論されています。私の推論は、彼らは後方互換性のために(そして、プッシュバックを避けるために)残されているが、彼らには愛がないと期待しているということです。 'utcnow'を使って' default' kwargを設定するだけで、TZ対応のdatetimesが必要な場合は、 'auto_now'や' auto_now_add'について心配する必要はありません。 –

    +0

    Chrisに感謝します。私は、 "デフォルト"は "auto_now"の代わりに動作するとは思えませんが、後者は常にすべての保存の時間を更新するので、 "default"はフィールドに値がないときだけです。 – dannyroa

    7

    は、datetime.now()DateTimeFieldデフォルト値を設定するように注意してください:あなたが「今」以下の方法を取得する必要が

    開発サーバー)、すべての後続レコードがその値を受け取ります。

    そのため、常にauto_now_addを使用してください。ジャンゴの

    +13

    角括弧なしで 'default = datetime.now'を使うだけです。 –

    13

    使用時間帯utilsの

    from django.utils import timezone 
    date_generated = models.DateTimeField(default=timezone.now) 
    
    +1

    このスレッドを表示している他の人には:答えが「今」で、「今」ではないことに注意してください。 2番目はサーバーのロード中に評価されますが、これはあなたが望むものではありません。 – Pieter

    関連する問題