首页 > 解决方案 > Django ORM datetime __range 字段查找未正确过滤

问题描述

我有一个简单的查询,我在其中检索从当前日期的上午 12 点到当前时间的所有行。

time_now = datetime.now()
time_passed = time_now.hour * 60 + time_now.minute
a = (datetime.now() - timedelta(minutes=time_passed))
b = datetime.now()
result_inwardCount = MYmsEvents.objects.all().filter(recorded_at__range=[a, b],event='In-ward')
print(result_inwardCount.query)
print(len(result_inwardCount))

现在,当我打印查询时,它给了我这个:

SELECT "m_yms_events"."id", "m_yms_events"."vin", "m_yms_events"."event", "m_yms_events"."location", "m_yms_events"."recorded_at", "m_yms_events"."sys_id", "m_yms_events"."x", "m_yms_events"."y", "m_yms_events"."last_updated" FROM "m_yms_events" WHERE ("m_yms_events"."event" = In-ward AND "m_yms_events"."recorded_at" BETWEEN 2021-05-19 00:00:37+05:30 AND 2021-05-19 16:49:37+05:30)

这给了我0结果。当我在其中运行相同的查询时,pgAdmin它会给我41行。以下是添加撇号后的查询:

SELECT "m_yms_events"."id", "m_yms_events"."vin", "m_yms_events"."event", "m_yms_events"."location", "m_yms_events"."recorded_at", "m_yms_events"."sys_id", "m_yms_events"."x", "m_yms_events"."y", "m_yms_events"."last_updated" FROM "m_yms_events" WHERE ("m_yms_events"."event" = 'In-ward' AND "m_yms_events"."recorded_at" BETWEEN '2021-05-19 00:00:37+05:30' AND '2021-05-19 16:49:37+05:30')

Postgres 中的时区是IST,服务器上的时区也是 。

在此处输入图像描述

标签: djangopostgresqldjango-orm

解决方案


正如您在Django 文档__range中看到的那样,直接使用Django字段查找。datetimes

这是一个简单的工作示例:

import datetime
start_date = datetime.date(2005, 1, 1)
end_date = datetime.date(2005, 3, 31)
Entry.objects.filter(pub_date__range=(start_date, end_date))

在您的特定情况下,只需删除将您转换datetimesstrings( .strftime('%Y-%m-%d %H:%M:%S')) 的代码部分:

a = (datetime.now() - timedelta(minutes=time_passed))
b = datetime.now()
result_inwardCount = MYmsEvents.objects.all().filter(recorded_at__range=[a, b], event='In-ward')

推荐阅读