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)
相同。未知列错误?请更新您的问题以共享您的实际模型和查询集,以便我们可以重现您的问题。