Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql Django ORM:按小时范围过滤_Sql_Django_Django Orm - Fatal编程技术网

Sql Django ORM:按小时范围过滤

Sql Django ORM:按小时范围过滤,sql,django,django-orm,Sql,Django,Django Orm,我正在尝试实现一个小时范围的过滤器,它应该返回日期介于hourA和hourB之间的记录(即:“给我16点到18点之间保存的记录”)。 我的尝试: 1) 使用新的1.6\uu小时过滤器和中的\uu或\uu范围: MyModel.objects.filter(date__hour__in=(16, 17, 18)) MyModel.objects.filter(date__hour__range=(16, 18)) 上面的代码生成异常 2) 使用Q对象: hList = [Q(date__hour

我正在尝试实现一个小时范围的过滤器,它应该返回日期介于hourA和hourB之间的记录(即:“给我16点到18点之间保存的记录”)。 我的尝试:

1) 使用新的1.6
\uu小时
过滤器和
中的
\uu或
\uu范围

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的情况下有效地按小时范围进行筛选

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

    all_points = MyModel.objects.all()
    all_points.extra(where=['extract(hour from MyDateField) in (16, 17, 18)'])
在中,问题中的示例将起作用:

MyModel.objects.filter(date__hour__in=(16, 17, 18))
MyModel.objects.filter(date__hour__range=(16, 18))

\uu gte
\uu lte
代替
\uu中的
\uu怎么样?你是指日期小时和日期小时吗?如果是这样的话,就我所知,以这种方式链接过滤器是不可能的:(@daveoncode你有没有想过?我也有同样的问题。不幸的是没有:(…目前唯一的方法是使用原始SQL(如果你关心优化的话)…我希望Django的未来版本将实现这种过滤器,或者是一种扩展现有过滤器的简单方法:P