shi*_*ifu 264 django django-mailer
我试图使用IPython发送一个简单的邮件.我还没有设置任何仍然出现此错误的模型.可以做些什么?
错误:/home/sourabh/Django/learn/local/lib/python2.7/site-packages/django/db/models/fields/ 初始化的.py:827:RuntimeWarning:DateTimeField字段接收到的日期时间幼稚(2013年9月4日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)
Run Code Online (Sandbox Code Playgroud)
kra*_*etz 440
问题不在于Django设置,而是在传递给模型的日期.以下是时区感知对象的外观:
>>> from django.utils import timezone
>>> import pytz
>>> timezone.now()
datetime.datetime(2013, 11, 20, 20, 8, 7, 127325, tzinfo=pytz.UTC)
Run Code Online (Sandbox Code Playgroud)
这是一个天真的对象:
>>> from datetime import datetime
>>> datetime.now()
datetime.datetime(2013, 11, 20, 20, 9, 26, 423063)
Run Code Online (Sandbox Code Playgroud)
因此,如果您在任何地方传递电子邮件日期(并且最终会获得某些模型),请使用Django now()
.如果没有,那么现有的包可能是一个问题,它在没有时区的情况下获取日期,您可以修改包,忽略警告或将USE_TZ设置为False.
dmr*_*mrz 49
使用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>
Run Code Online (Sandbox Code Playgroud)
gie*_*s0r 14
又快又脏——把它关掉:
USE_TZ = False
Run Code Online (Sandbox Code Playgroud)
在你的 settings.py
Sac*_* G. 11
只是为了修复错误来设置当前时间
from django.utils import timezone
import datetime
datetime.datetime.now(tz=timezone.utc) # you can use this value
Run Code Online (Sandbox Code Playgroud)
您还可以覆盖设置,在测试中特别有用:
from django.test import override_settings
with override_settings(USE_TZ=False):
# Insert your code that causes the warning here
pass
Run Code Online (Sandbox Code Playgroud)
这将阻止您看到警告,同时您的代码中需要时区感知日期时间的任何内容都可能会给您带来问题。如果是这种情况,请参阅 kravietz 的回答。
小智 8
在模型中,不要传递值:
timezone.now()
Run Code Online (Sandbox Code Playgroud)
相反,删除括号并传递:
timezone.now
Run Code Online (Sandbox Code Playgroud)
如果您继续收到运行时错误警告,请考虑将模型字段从 DateTimeField 更改为 DateField。
如果您试图将一个天真的日期时间转换为 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>)
>>>
Run Code Online (Sandbox Code Playgroud)
t1 是一个简单的日期时间,而 t2 是 django 设置中带有时区的日期时间。
小智 7
确保 settings.py 有
USE_TZ = True
在你的 python 文件中:
from django.utils import timezone
timezone.now() # use its value in model field
Run Code Online (Sandbox Code Playgroud)
既可以修复警告,也可以使用settings.py中指定的时区,这可能与UTC不同。
例如在我的settings.py中,我有:
USE_TZ = True
TIME_ZONE = 'Europe/Paris'
Run Code Online (Sandbox Code Playgroud)
这是一个解决方案;优点是可以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'
Run Code Online (Sandbox Code Playgroud)
另一种等效的方法是使用make_aware
,请参见dmrz post。
归档时间: |
|
查看次数: |
158244 次 |
最近记录: |