查询django时不是天真的时区

时间:2017-02-19 13:47:02

标签: django sqlite timezone

我已经从Sqlite-DB中删除了所有时区初始条目。所以现在他们剩下的条目都有这样的日期字段:

2016-09-04 13:28:16 + 00

当我现在运行我的查询时:

result = Feedentry.objects.filter(date_published__gt=timezone('Europe/Berlin').localize(datetime(2016, 8, 31, 17)))

首先我没有收到任何错误,但只要我想访问结果(或len(结果)),我就会收到以下错误:

raise ValueError('Not naive datetime (tzinfo is already set)')

任何想法如何解决或我做错了什么?

1 个答案:

答案 0 :(得分:1)

Django始终以UTC格式存储日期时间。在SQLite中doesn't store any timezone information at all

  

[PostgreSQL以外的数据库]存储没有时区信息的日期时间。如果您从USE_TZ = False切换到USE_TZ = True,则必须将数据从当地时间转换为UTC - 如果当地时间有夏令时,这不是确定性的。

首先,您需要浏览数据库并将所有值转换为UTC;否则,Django将无法正确解释这些值。

至于您的比较,如果您正在使用pytz.timezone和天真的datetime,这是正确的。但错误消息表明,您传递给datetime的任何localize()已经是时区感知的。要转换时区感知datetime,您需要使用datetime.astimezone(),如pytz documentation中所述。