我想用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) while time zone support is active。
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)
可以修复警告,也可以使用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 post。
问题不在于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。