Loaddata没有正确处理时间戳和时区

IMF*_*her 6 python django yaml

我正在使用启用了mysql和timezones的django 1.4.1.我向yaml做了一个转储数据,修改了一些字段以创建一些测试数据,并且我试图将其加载回来.但是,即使指定了tz,Django仍然抱怨天真的日期时间

具体来说,我的loaddata有:

fields: {created_date: !!timestamp '2012-09-15 22:17:44+00:00', ...
Run Code Online (Sandbox Code Playgroud)

但loaddata给出错误:

RuntimeWarning: DateTimeField received a naive datetime (2012-09-15 22:17:44) while time zone support is active.
Run Code Online (Sandbox Code Playgroud)

这对我来说没有多大意义,因为它看起来像:

  1. UTC时间戳
  2. Django使用dumpdata导出的格式相同

有什么方法可以告诉django这是一个UTC日期吗?

And*_*ham 22

问题源于PyYAML.当loaddata将日期时间移交给PyYAML时,它需要知道日期时间,将时间调整为UTC,然后返回一个天真的日期时间,从而生成警告.

有一个Django票,以及有关该问题的PyYAML票.两者都涉及上述意外行为的更多细节.从票证中的评论来看,这个问题似乎不太可能很快得到解决.

如果您TIME_ZONE = 'UTC'在项目的settings.py中设置,您将在正确的时间加载,但您仍会收到警告.如果您的时区设置为其他任何内容,Django会将日期时间视为本地时间,并将其调整为UTC,这可能是不受欢迎的.

避免这种情况的最佳方法是使用JSON作为序列化格式.

希望有所帮助.


Aya*_*Aya 9

来自文档 ......

序列化感知日期时间时,包括UTC偏移量,如下所示:

"2011-09-01T13:20:30+03:00"
Run Code Online (Sandbox Code Playgroud)

对于一个天真的日期时间,它显然不是:

"2011-09-01T13:20:30"
Run Code Online (Sandbox Code Playgroud)

......所以而不是......

created_date: !!timestamp '2012-09-15 22:17:44+00:00'
Run Code Online (Sandbox Code Playgroud)

...... ......

created_date: '2012-09-15T22:17:44+00:00'
Run Code Online (Sandbox Code Playgroud)

...要么...

created_date: '2012-09-15T22:17:44Z'
Run Code Online (Sandbox Code Playgroud)

...将工作.