【发布时间】:2015-08-13 15:59:23
【问题描述】:
我刚刚意识到我们的生产设置中存在一些非常奇怪的日期比较行为,我不明白。
上市模式
title (CharField)
from_date (DateTimeField)
to_date (DateTimeField)
查询集
now = arrow.now()
Listing.objects.filter(to_date__gte=now.datetime)
设置
- Python 2.7
- Django 1.7
- SQLite / PostgreSQL
- Ubuntu
问题
当列表对象的 to_date 设置为比现在早一小时时,无论是在开发服务器上还是在生产服务器上的 shell 上,查询集都会返回正确的结果(相关列表不包括在内)。但是,在生产服务器上,查询继续包含列表(未启用缓存)。我已经确定,如果我将列表的日期设置为前一天,则它会被正确排除,从而似乎只比较了几天(我什至将时间设置为 00:00 以排除时区问题,但这仍然包括列表- 如前所述,仅更改工作日)。请问为什么会出现这种情况,我该如何解决?
其他信息
- 我已使用“date”命令确认服务器时区与 settings.py 中指定的时区一致
- 我已确认 settings.py 中的
USE_TZ = True并且 TIME_ZONE 已正确设置。 - 我已经登录到服务器上的 PostgreSQL 终端并运行
now命令 - 这返回了与系统时区和 settings.py 中指定的时区相同的时区 - 我已确认 postgresql 中的 to_date 字段是“带有时区字段的时间戳”
- 传递给 db:
WHERE ( "directory_listing"."to_date" >= 2015-08-22 14:01:56.663072)的实际 sql 提取
【问题讨论】:
-
系统上的时间是否正确?用“日期”命令检查。
-
@ChrisMontanaro 是的,我确实检查了日期,并且精确到分钟。我还在服务器上的 shell 上运行了查询,它返回正确的结果
-
您可以检查/比较实际针对数据库抛出的 sql: print Listing.objects.filter(to_date__gte=now.datetime).query 这应该让您了解正在发生的事情。
-
谢谢 - 这样做了 - 它正在使用预期的日期。无论如何,查询总是在 shell 中返回正确的结果
-
如果两个查询相同,则查看(postgres?)查询日志。您应该在那里看到完整的 UTC(或其他时区)日期。在您的项目 setting.py 中仔细检查您的 USE_TZ 和 TIME_ZONE。或者:在视图中显示您的请求时区:docs.djangoproject.com/en/1.7/topics/i18n/timezones/…
标签: python django postgresql