Django RuntimeWarning:DateTimeField接收到原始日期时间

Django RuntimeWarning:DateTimeField接收到原始日期时间,django,django-mailer,Django,Django Mailer,我正在尝试使用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

我正在尝试使用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)

问题不在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。

使用函数使原始datetime对象了解时区并避免这些警告

它将原始datetime对象(不含时区信息)转换为具有时区信息的对象(如果未将其明确指定为第二个参数,则使用django设置中指定的时区):

导入日期时间
从django.conf导入设置
从django.utils.timezone导入使您知道
naive_datetime=datetime.datetime.now()
Naiver_datetime.tzinfo#无
settings.TIME_ZONE#“UTC”
aware_datetime=使_知晓(naive_datetime)
aware_datetime.tzinfo#

只是为了修复设置当前时间的错误

from django.utils import timezone
import datetime

datetime.datetime.now(tz=timezone.utc) # you can use this value

可以修复警告并使用settings.py中指定的时区,该时区可能与UTC不同

例如,在my 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'
>>从datetime导入datetime
>>>从django.utils.timezone导入获取当前时区
>>>mydate=datetime.now(tz=get\u current\u timezone())
>>>mydate
datetime.datetime(2019、3、10、11、16、9、184106、,
tzinfo=)
>>>str(mydate)
'2019-03-10 11:16:09.184106+01:00'

另一种等效方法是使用
使您知道
,请参阅dmrz post。

快速且肮脏-将其关闭:

USE_TZ = False

在您的
settings.py

中,如果您试图将原始日期时间转换为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>)
>>>
导入日期时间
>>>从django.utils导入时区 >>>t1=datetime.datetime.strtime(“2019-07-16 22:24:00,“%Y-%m-%d%H:%m:%S”) >>>t1 日期时间。日期时间(2019、7、16、22、24) >>>当前时区。获取当前时区() >>>t2=电流局部化(t1) >>>t2 datetime.datetime(2019,7,16,22,24,tzinfo=) >>>

t1是一个简单的日期时间,t2是django设置中带有时区的日期时间。

您还可以覆盖设置,在测试中特别有用:

from django.test import override_settings

with override_settings(USE_TZ=False):
    # Insert your code that causes the warning here
    pass

这将阻止您看到警告,同时代码中任何需要时区感知日期时间的内容都可能给您带来问题。如果是这种情况,请参见kravietz答案。

在模型中,不要传递值:

timezone.now()
而是删除括号,然后传递:

timezone.now

如果您继续获得运行时错误警告,请考虑将模型字段从DATETIEMEDE更改为DATEFIEL.

确保StutsP.Py

USE_TZ=True

在python文件中:

from django.utils import timezone

timezone.now() # use its value in model field


你在哪里写
tzinfo=
,什么是
?这不是我见过的一个语法结构。晚会有点晚了,但你看到的是shell的输出。更具体地说,它是datetime对象的repr方法的输出,返回对象的可打印信息。在使用
datetime.now
的地方,将其更改为
timezone.now
,并将
从django.utils导入timezone
添加到顶部。对于仍在查找该部分的用户,您可以使用此选项:
import pytz
datetime.datetime(2013,11,20,20,8,7127325,tzinfo=pytz.UTC)
我的设置是
use\TZ=True
时区='UTC'
。但是当我使用
timezone.now()
时,它不会显示
tzinfo=
。。。。因此,这个datetime对象作为原始对象传递。为什么会发生这种情况?对于datetime.datetime(9999,01,01,tzinfo=timezone.utc)IMO来说,这是django.utils import timezone timezone最实用的解决方案。now()#在USE#TZ为真且数据库支持时区(例如PostgreSQL)时也可以工作,设置此选项是一个错误,感谢您的回答,这是最符合django标准的将原始日期转换为带有django设置时区的日期的方法:)是否可以将其放入模型中。py?@Florent如果默认使用utc时区,则无需更改模型中的任何内容,
auto_now
auto_now_add
将适用于日期时间字段。如果出于某种原因需要在模型中具有时区感知的当前日期时间对象,请使用
django.utils.timezone.now()
函数。
from django.utils import timezone

timezone.now() # use its value in model field