我正在尝试为小时范围实现过滤器,它应该返回日期介于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的情况下以有效的方式按小时范围进行过滤?
答案 0 :(得分:1)
我设法以这种方式解决了这个问题:
all_points = MyModel.objects.all()
all_points.extra(where=['extract(hour from MyDateField) in (16, 17, 18)'])
答案 1 :(得分:0)
在Django 1.9+ you can chain hour lookups中,问题中的示例将起作用:
MyModel.objects.filter(date__hour__in=(16, 17, 18))
MyModel.objects.filter(date__hour__range=(16, 18))