我正在尝试为小时范围实现过滤器,它应该返回日期在 hourA 和 hourB 之间的记录(即:“给我在下午 16 点到晚上 18 点之间保存的记录”)。我的尝试:
1)使用新的 1.6__hour
过滤器和__in
或__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?