Django筛选器日期范围ORM问题

时间:2019-02-11 18:42:54

标签: python django datetime django-filter

我在找出我要去哪里的地方时遇到了一些麻烦。我正在尝试收集日期范围为15天的数据库中的条目,但我的查询没有选择正确的选项。

这是我代码的重要部分:

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)>]>

在这里我应该选择3的时候只选择1行,这是我的date_created值,分别用于第7、8和9行,仅选择了第7行:

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

2 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分:0)

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

从开始和结束日期中删除.replace(tzinfo=pytz.UTC),您应该会很好。