Django条件注释

jMy*_*les 8 django django-queryset django-aggregation

我很惊讶这个问题显然还不存在.如果有,请帮我找到它.

我想使用annotate(Count)和order_by,但我不想计算相关对象的每个实例,只计算满足某个标准的那些实例.

也就是说,我可以根据他们携带的绿椰子的数量来列出燕子:

swallow.objects.annotate(num_coconuts=Count('coconuts_carried__husk__color = "green"').order_by('num_coconuts')
Run Code Online (Sandbox Code Playgroud)

rew*_*ten 8

这应该是正确的方法.

swallow.objects.filter(
    coconuts_carried__husk__color="green"
).annotate(
    num_coconuts=Count('coconuts_carried')
).order_by('num_coconuts')
Run Code Online (Sandbox Code Playgroud)

请注意,当您筛选相关字段时,在原始SQL中它将转换为LEFT JOIN和WHERE.最后,注释将作用于结果集,该结果集仅包含从第一个过滤器中选择的相关行.

  • 如果你想包括没有携带任何绿椰子的燕子怎么办? (2认同)

小智 5

对于Django> = 1.8:

from django.db.models import Sum, Case, When, IntegerField

swallow.objects.annotate(
    num_coconuts=Sum(Case(
        When(coconuts_carried__husk__color="green", then=1),
        output_field=IntegerField(),
    ))
).order_by('num_coconuts')
Run Code Online (Sandbox Code Playgroud)