【问题标题】:Django ORM datetime __range field lookup not filtering properlyDjango ORM datetime __range 字段查找未正确过滤
【发布时间】:2021-08-08 15:55:12
【问题描述】:

我有一个简单的查询,我检索从当前日期的上午 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,服务器上的时区也是。

【问题讨论】:

  • 只是一个额外的小费。 print(len(result_inwardCount)) 应该是 print(result_inwardCount).count()。它更快更好。你可以在这里了解原因stackoverflow.com/questions/14327036/…

标签: django postgresql django-orm


【解决方案1】:

Django __range 字段查找直接与datetimes 一起使用,如您在Django documentation 中所见。

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

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

在您的具体情况下,只需删除将您的 datetimes 转换为 strings (.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')

【讨论】:

  • 最初我只是这样做,即我没有将它转换为字符串。我想我会自己编辑这个问题。问题仍然相同。我想指出一条信息,即recorded_at 字段定义为recorded_at timestamp without time zone NOT NULL DEFAULT NOW(),
猜你喜欢
  • 2017-03-03
  • 2021-10-23
  • 2015-05-04
  • 2019-07-06
  • 1970-01-01
  • 2020-08-28
  • 2017-07-02
  • 1970-01-01
  • 2019-01-27
相关资源
最近更新 更多