457

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

エラー: /home/sourabh/Django/learn/local/lib/python2.7/site-packages/django/db/models/fields/ init .py:827: RuntimeWarning: DateTimeField がナイーブな日時を受け取りました (2013-09-04 14:14:13.698105) タイムゾーンのサポートがアクティブな間。ランタイム警告)

試した : 最初のステップは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)
4

9 に答える 9

650

問題は 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 に設定できます。

于 2013-11-20T20:16:24.277 に答える
166

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

単純な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>
于 2017-07-13T12:27:21.380 に答える
15

警告修正し、UTC とは異なる可能性がある settings.py で指定されたタイムゾーンを使用することができます。

たとえば、私の 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 の投稿を参照してください。

于 2019-03-10T10:40:04.720 に答える