RuntimeWarning: DateTimeField получил наивное datetime

221

Я пытаюсь отправить простую почту с помощью 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)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)
Теги:
django-mailer

4 ответа

346
Лучший ответ

Проблема не в настройках 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.

  • 20
    спасибо, решил мою 100-летнюю проблему!
  • 6
    Где вы пишете tzinfo=<UTC> , что такое <UTC> ? Это не синтаксическая конструкция, которую я видел.
Показать ещё 7 комментариев
16

Используйте функцию 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>
13

here doc о проблеме, с которой вы столкнулись Часовой пояс и приборы

6

Просто исправить ошибку, чтобы установить текущее время

from django.utils import timezone
import datetime

datetime.datetime.now(tz=timezone.utc) # you can use this value
  • 1
    и для datetime.datetime (9999, 01, 01, tzinfo = timezone.utc)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню