Django 过滤器日期范围 ORM 问题

Django Filter Date Range ORM Issue

我在弄清楚哪里出了问题时遇到了一些麻烦。我试图在数据库中收集日期范围为 15 天的条目,但我的查询没有 select 正确的选项。

这是我的代码的重要部分:

start = datetime.now().replace(tzinfo=pytz.UTC) - timedelta(days=15)
end = datetime.now().replace(tzinfo=pytz.UTC)
# 2019-01-27 10:26:16.235354+00:00 | 2019-02-11 10:26:16.235354+00:00
print(start, '|', end)

completed_work_orders = WorkOrders.objects.using(db_alias).filter(
    unit_id=int(resident.unit_id),
    resident_dismissed=1).filter(date_created__range=[start, end]).order_by('-date_created')

这给了我: completed: <QuerySet [<WorkOrders: WorkOrders object (7)>]>

这里我只 select 1 行,而它应该是 selecting 3,这里是我的 date_created 第 7、8 和 9 行的值,只有第 7 行是select编辑:

7) 已选 2019-02-07 12:07:59.72546-08

8) 未选中 2019-02-11 08:58:27.561245-08

9) 未选中 2019-02-11 09:03:35.063078-08

您的结束日期采用 UTC 时区,但您数据库中的记录已本地化为您服务器的时区。根据您服务器的时区,2019-02-11 10:26:16.235354+00:00 的结束日期实际上会有所不同,例如,对于纽约来说,它将是 2019-02-11 05:26:16.235354+00:00

从开始日期和结束日期中删除 .replace(tzinfo=pytz.UTC),你应该没问题。

您最终过滤的日期可能与数据库中存储的时区不同。

对于 Django,您应该始终使用 django.utils.timezone.now() 而不是 datetime.now()。这样,您就可以确保获得与项目时区相匹配的日期,然后该日期应与存储在数据库中的日期时间相匹配。

更多信息:https://docs.djangoproject.com/en/2.1/topics/i18n/timezones/#naive-and-aware-datetime-objects