Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.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
Django ORM:如何使用带注释字段的过滤器进行聚合?_Django_Django Orm - Fatal编程技术网

Django ORM:如何使用带注释字段的过滤器进行聚合?

Django ORM:如何使用带注释字段的过滤器进行聚合?,django,django-orm,Django,Django Orm,我有统计视图,其中我在一些基本查询集的不同过滤器上计算多个计数: qs=Model.onjects.filter(…).annotate(a=…) a=qs.filter(Q(a_ult=5)).count() b=qs.filter(Q(a_ult=10)).count()#这只是一个例子,实际的过滤器更复杂 ... 但是每个计数都会对数据库进行单独的查询,我想对其进行优化。我尝试了聚合: qs.aggregate( a=Count('a', filter=Q(a__lt=5)),

我有统计视图,其中我在一些基本查询集的不同过滤器上计算多个
计数

qs=Model.onjects.filter(…).annotate(a=…)
a=qs.filter(Q(a_ult=5)).count()
b=qs.filter(Q(a_ult=10)).count()#这只是一个例子,实际的过滤器更复杂
...
但是每个计数都会对数据库进行单独的查询,我想对其进行优化。我尝试了聚合:

qs.aggregate(
  a=Count('a', filter=Q(a__lt=5)), 
  b=Count('a', filter=Q(a__lt=10)),
)
但是得到了一个错误:
django.db.utils.OperationalError:(1054,“字段列表”中的未知列“\uu col2”)
。我甚至不知道这是从哪里来的


聚合似乎不能很好地与注释一起工作,因为当我在
count.filter中使用常规模型字段而不是注释字段
a
时,一切都很好。

如果您使用的是Django 2.2,您的方法应该可以工作,如前所述。您可能应该指望
'pk'
,如图所示,但不确定您能否指望注释本身:

qs.aggregate(
    a=Count('pk', filter(Q(a__lt=5)),
    b=Count('pk', filter(Q(a__lt=10))
)
如果您使用的是Django 1.11,上述方法不起作用,因为
Count
将始终返回1,忽略过滤器。您应该使用
Case。。。当

qs.aggregate(
    a=Sum(
        Case(When(a__lt=5, then=1),
             output_field=IntegerField())
    ),
    b=Sum(
        Case(When(a__lt=10, then=1),
             output_field=IntegerField())
    )
)

如果真正的过滤器可能包含一个
\uu col2
,那么最好看看是什么触发了错误,这样我们就可以看到是什么导致了错误。
聚合
是打字错误吗?它应该是
aggregate
只需执行
Count('pk',filter=Q(a_ult=5))
。计算哪一列并不重要,但计算列可能是个问题。我想你想要的是一种“双重”注释。类似于:
qs.annotate(a=Count(“a”,filter=Q(a_ult=5))
我明白你的意思@dirkgroten。我误解了这个问题。因此,忽略我的评论:)我使用的是django 2.0.3,
Count
filter
通常都能正常工作,但是如果我在
Count
的过滤器中使用注释字段,那么它会抛出一个错误。与
Sum(When)
相同。未知列错误?请更新您的问题以共享您的实际模型和查询集,以便我们可以重现您的问题。