Django ORM:按小时范围过滤

时间:2013-11-13 15:55:55

标签: sql django django-orm

我正在尝试为小时范围实现过滤器,它应该返回日期介于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的情况下以有效的方式按小时范围进行过滤?

2 个答案:

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