我很惊讶这个问题显然还不存在。如果有,请帮我找到它。
我想使用 annotate (Count) 和 order_by,但我不想计算相关对象的每个实例,只计算满足某个标准的那些。
也就是说,我可以按照燕子携带的绿色椰子的数量来列出燕子:
swallow.objects.annotate(num_coconuts=Count('coconuts_carried__husk__color = "green"').order_by('num_coconuts')
我很惊讶这个问题显然还不存在。如果有,请帮我找到它。
我想使用 annotate (Count) 和 order_by,但我不想计算相关对象的每个实例,只计算满足某个标准的那些。
也就是说,我可以按照燕子携带的绿色椰子的数量来列出燕子:
swallow.objects.annotate(num_coconuts=Count('coconuts_carried__husk__color = "green"').order_by('num_coconuts')
对于 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')
这应该是正确的方法。
swallow.objects.filter(
coconuts_carried__husk__color="green"
).annotate(
num_coconuts=Count('coconuts_carried')
).order_by('num_coconuts')
请注意,当您过滤相关字段时,在原始 SQL 中,它会转换为 LEFT JOIN 加上 WHERE。最后,注释将作用于结果集,该结果集仅包含从第一个过滤器中选择的相关行。