我正在尝试使用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)虽然时区支持是活跃的。 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)
答案 0 :(得分:411)
问题不在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。
答案 1 :(得分:26)
使用django.utils.timezone.make_aware功能让您的天真日期时间对象可以识别时区并避免这些警告。
它将天真的日期时间对象(没有时区信息)转换为具有时区信息的对象(使用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>
答案 2 :(得分:9)
修复错误以设置当前时间
from django.utils import timezone
import datetime
datetime.datetime.now(tz=timezone.utc) # you can use this value
答案 3 :(得分:1)
一个人可以同时修正警告 并使用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帖子。
答案 4 :(得分:1)
在模型中,不要传递值:
timezone.now()
相反,删除括号并通过:
timezone.now
如果继续收到运行时错误警告,请考虑将模型字段从DateTimeField更改为DateField。
答案 5 :(得分:1)
确保settings.py具有
USE_TZ = True
在您的python文件中:
from django.utils import timezone
timezone.now() # use its value in model field
答案 6 :(得分:0)
又快又脏-将其关闭:
<input type="submit" value="Submit />
在您的USE_TZ = False
答案 7 :(得分:0)
如果您尝试将原始日期时间转换为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 :(得分:0)
您还可以覆盖设置,这在测试中特别有用:
from django.test import override_settings
with override_settings(USE_TZ=False):
# Insert your code that causes the warning here
pass
这将防止您看到警告,同时代码中需要时区感知日期时间的任何内容都可能给您带来麻烦。如果是这种情况,请参见kravietz答案。