3

我正在尝试为小时范围实现过滤器,它应该返回日期在 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?

4

2 回答 2

1

我设法以这种方式解决了这个问题:

    all_points = MyModel.objects.all()
    all_points.extra(where=['extract(hour from MyDateField) in (16, 17, 18)'])
于 2014-07-30T15:23:03.037 回答
0

Django 1.9+ 中,您可以链接小时查找,因此问题中的示例将起作用:

MyModel.objects.filter(date__hour__in=(16, 17, 18))
MyModel.objects.filter(date__hour__range=(16, 18))
于 2018-04-20T13:59:55.697 回答