RuntimeWarning: DateTimeField получил наивное datetime
Я пытаюсь отправить простую почту с помощью IPython. Я не настроил какие-либо модели, все еще получая эту ошибку. Что можно сделать?
Ошибка: /home/sourabh/Django/learn/local/lib/python 2.7/site-packages/django/db/models/fields/ init.py:827: RuntimeWarning: DateTimeField получил наивное datetime ( 2013-09-04 14: 14: 13.698105), в то время как поддержка часовых поясов активна. RuntimeWarning)
Пробовал: первым шагом будет добавить USE_TZ = True
в ваш файл настроек и установить pytz
(если возможно).
Ошибка:
(learn)[email protected]:~/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)
Ответы
Ответ 1
Проблема не в настройках 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.
Ответ 2
Используйте функцию django.utils.timezone.make_aware, чтобы ваши наивные объекты даты и времени знали о часовом поясе и избегали этих предупреждений.
Он преобразует наивный объект datetime (без информации о часовом поясе) в объект с информацией о часовом поясе (используя часовой пояс, указанный в настройках 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>
Ответ 3
here doc о проблеме, с которой вы столкнулись Часовой пояс и приборы
Ответ 4
Просто исправить ошибку, чтобы установить текущее время
from django.utils import timezone
import datetime
datetime.datetime.now(tz=timezone.utc) # you can use this value
Ответ 5
Можно как исправить предупреждение, так и использовать часовой пояс, указанный в 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.
Ответ 6
Быстро и грязно - выключите его:
USE_TZ = False
в твоих settings.py
Ответ 7
Если вы пытаетесь преобразовать наивную дату и время в часовой пояс в 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.
Ответ 8
Вы также можете переопределить настройки, особенно полезные в тестах:
from django.test import override_settings
with override_settings(USE_TZ=False):
# Insert your code that causes the warning here
pass
Это помешает вам увидеть предупреждение, в то же время все, что в вашем коде требует указание даты и времени в часовом поясе, может вызвать проблемы. Если это так, смотрите ответ кравец.