RuntimeWarning:DateTimeFieldが単純な日時を受け取りました


310

IPythonを使用して簡単なメールを送信しようとしています。このエラーが発生するモデルをまだ設定していません。何ができますか?

エラー:/home/sourabh/Django/learn/local/lib/python2.7/site-packages/django/db/models/fields/ init .py:827:RuntimeWarning:DateTimeField received a naive datetime(2013-09-04 14:14:13.698105)タイムゾーンのサポートがアクティブな間。RuntimeWarning)

試した:最初のステップはUSE_TZ = True、設定ファイルに追加してインストールすることですpytz(可能な場合)。

エラーが変更されました:

(learn)sourabh@sL:~/Django/learn/event$ python manage.py shell
/home/sourabh/Django/learn/local/lib/python2.7/site-packages/django/db/backends/sqlite3/base.py:53: RuntimeWarning: SQLite received a naive datetime (2013-09-05 00:59:32.181872) while time zone support is active.
  RuntimeWarning)

回答:


490

問題はDjangoの設定ではなく、モデルに渡された日付にあります。タイムゾーン対応オブジェクトは次のようになります。

>>> from django.utils import timezone
>>> import pytz
>>> timezone.now()
datetime.datetime(2013, 11, 20, 20, 8, 7, 127325, tzinfo=pytz.UTC)

そしてここに素朴なオブジェクトがあります:

>>> from datetime import datetime
>>> datetime.now()
datetime.datetime(2013, 11, 20, 20, 9, 26, 423063)

したがって、メールの日付をどこかに渡す場合(そして最終的にはあるモデルに到達する場合)は、Djangoを使用するだけnow()です。そうでない場合は、おそらくタイムゾーンなしで日付をフェッチする既存のパッケージの問題であり、パッケージにパッチを適用するか、警告を無視するか、USE_TZをFalseに設定できます。


8
あなたが書く場合はtzinfo=<UTC>、何がありますか<UTC>?それは私が見た構文の構成ではありません。
jameshfisher 2015

4
パーティーには少し遅れますが、表示されているのはシェルからの出力です。より具体的には、オブジェクトの印刷可能な情報を返すのは、datetimeオブジェクトのreprメソッドからの出力です。
ジョージグリフィン

36
を使用していた場所でdatetime.now、をに変更し、上部にtimezone.now追加from django.utils import timezoneします。
Unoti、2015年

12
:まだその<UTC>の部分をお探しの方のために、あなたはこれを使用することができますimport pytz datetime.datetime(2013, 11, 20, 20, 8, 7, 127325, tzinfo=pytz.UTC)
Anoyz

私の設定はUSE_TZ = TrueTIME_ZONE = 'UTC'です。しかし、使用timezone.now()しても表示されませんtzinfo=<UTC>....したがって、このdatetimeオブジェクトはナイーブオブジェクトとして渡されます。なぜそれが起こるのですか?
user3595632

71

django.utils.timezone.make_aware関数を使用して、単純なdatetimeオブジェクトをタイムゾーンに対応させ、それらの警告を回避します。

ナイーブな日時オブジェクト(タイムゾーン情報なし)をタイムゾーン情報を持つオブジェクトに変換します(2番目の引数として明示的に指定しない場合は、django設定で指定されたタイムゾーンを使用します):

import datetime
from django.conf import settings
from django.utils.timezone import make_aware

naive_datetime = datetime.datetime.now()
naive_datetime.tzinfo  # None

settings.TIME_ZONE  # 'UTC'
aware_datetime = make_aware(naive_datetime)
aware_datetime.tzinfo  # <UTC>

この回答をありがとう、これは単純な日付を私のdjango設定のタイムゾーンを持つ日付に変換する最もdjangoに準拠した方法です:)
sodimel

これをmodels.pyに入れることは可能ですか?
フローレント

あなたは、デフォルトでUTCタイムゾーンを使用し、場合@Florentモデルでの変更は何もする必要はありませんauto_nowし、auto_now_add日時フィールドの罰金に動作します。何らかの理由でモデルのタイムゾーン対応の現在の日時オブジェクトが必要な場合は、django.utils.timezone.now()関数を使用してください。
dmrz

26

エラーを修正して現在の時刻を設定するだけです

from django.utils import timezone
import datetime

datetime.datetime.now(tz=timezone.utc) # you can use this value

4
およびdatetime.datetime(9999、01、01、tzinfo = timezone.utc)の場合
I. Yegor

IMOこれは最も実用的なソリューションです
Ramtin

9

警告修正することも、settings.pyで指定されたタイムゾーン使用することもできますが、UTCとは異なる場合があります。

たとえば、私のsettings.pyで私は持っています:

USE_TZ = True
TIME_ZONE = 'Europe/Paris'

これが解決策です。利点はstr(mydate)、正しい時間を与えることです。

>>> from datetime import datetime
>>> from django.utils.timezone import get_current_timezone
>>> mydate = datetime.now(tz=get_current_timezone())
>>> mydate
datetime.datetime(2019, 3, 10, 11, 16, 9, 184106, 
    tzinfo=<DstTzInfo 'Europe/Paris' CET+1:00:00 STD>)
>>> str(mydate)
'2019-03-10 11:16:09.184106+01:00'

別の同等の方法はを使用make_awareすることです。dmrzの投稿を参照してください。



3

設定を上書きすることもでき、特にテストで役立ちます。

from django.test import override_settings

with override_settings(USE_TZ=False):
    # Insert your code that causes the warning here
    pass

これにより、警告が表示されなくなります。同時に、タイムゾーン対応の日時を必要とするコード内で問題が発生する可能性があります。この場合は、kravietzの回答を参照してください。


2

あなたがdjangoでナイーブ日時をタイムゾーン付きの日時に変換しようとしている場合、これが私の解決策です:

>>> import datetime
>>> from django.utils import timezone
>>> t1 = datetime.datetime.strptime("2019-07-16 22:24:00", "%Y-%m-%d %H:%M:%S")
>>> t1
    datetime.datetime(2019, 7, 16, 22, 24)
>>> current_tz = timezone.get_current_timezone()
>>> t2 = current_tz.localize(t1)
>>> t2
    datetime.datetime(2019, 7, 16, 22, 24, tzinfo=<DstTzInfo 'Asia/Shanghai' CST+8:00:00 STD>)
>>>

t1は単純な日時で、t2はdjangoの設定でのタイムゾーン付きの日時です。

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