【问题标题】:Not naive timezone when querying django查询 django 时不是天真的时区
【发布时间】:2017-02-19 13:47:01
【问题描述】:

我已经从我的 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(result)),我就会收到以下错误:

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

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

【问题讨论】:

    标签: django sqlite timezone


    【解决方案1】:

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

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

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

    至于你的比较,如果你使用pytz.timezone 和一个幼稚的datetime 是正确的。但是错误消息暗示您传递给localize() 的任何datetime 已经是时区感知的。要转换时区感知 datetime,您需要使用 datetime.astimezone(),如 pytz documentation 中所述。

    【讨论】:

    • 感谢您的快速回复。那么,如果我将上面的代码用于我的 postgresql-DB 但对于测试环境我需要使用 datetime.asttimezone()-函数来使 datetime-field timesone 天真,那么我是否正确?我可以请您向我提供从您的角度来看应该是的代码行吗?谢谢!!!
    • @Kev:要真正追踪错误,您应该将完整的回溯添加到您的问题中。
    • 感谢凯文 - 它对我帮助很大。我现在已经从我的 Sqlite-DB 中的列中替换了时区,它可以正常工作(对于我服务器上的 Postgresql 也是如此)
    猜你喜欢
    • 2013-03-11
    • 1970-01-01
    • 2019-11-16
    • 1970-01-01
    • 2012-04-17
    • 2016-07-09
    • 1970-01-01
    • 2014-12-03
    • 1970-01-01
    相关资源
    最近更新 更多