我正在尝试实现一个时间范围的过滤器,它应该返回日期在 hourA 和 hourB 之间的记录(即:“给我在下午 16 点到 18 点之间保存的记录”)。
我的尝试:
1)使用新的1.6__hour
过滤器和__in
or __range
:
MyModel.objects.filter(date__hour__in=(16, 17, 18))
MyModel.objects.filter(date__hour__range=(16, 18))
上面的代码会产生异常
2)使用Q对象:
hList = [Q(date__hour=h) for h in (16, 17, 18)]
MyModel.objects.filter(reduce(operator.or_, hList))
这个版本可以工作,但效率非常低,因为在该范围内的每个小时,它都会通过生成类似以下内容来重复 extract() 调用:
where
extract(hour from date) = 16 or
extract(hour from date) = 17 or
extract(hour from date) = 18
相反,正确的原始 SQL 应该是:
where extract(hour from date) in (16, 17, 18)
...如何在不依赖原始 sql 的情况下有效地按小时范围进行过滤?