Django条件计数

时间:2012-04-15 01:20:14

标签: mysql django annotations

我正在查询我标记为“可见”的所有标签的名称:

visible_tags = Tag.objects.filter(visible=True,taggit_taggeditem_items__content_type=ContentType.objects.get_for_model(Action)).order_by('name')

我想添加一个名为“action_count”的字段,告诉我有多少操作与此标记相关联:

visible_tags = Tag.objects.filter(visible=True,taggit_taggeditem_items__content_type=ContentType.objects.get_for_model(Action)).order_by('name').annotate(action_count=Count('action'))

除非我想知道现在很多动作都是附属的,但是有多少不完整与这个标签有关联的行为。

我尝试了以下内容:

visible_tags = Tag.objects.filter(visible=True,taggit_taggeditem_items__content_type=ContentType.objects.get_for_model(Action)).order_by('name').filter(action__complete=False).annotate(action_count=Count('action'))

但这并不是我需要做的事情。 如何注释不完整的操作计数?

1 个答案:

答案 0 :(得分:1)

您可能会获得比预期更多的计数。这是因为链式.filter引入了额外的内连接,非常类似于问题Are chained QuerySet filters equivalent to defining multiple fields in a single filter with the Django ORM? 因此将第二个过滤器放在第一个过滤器中:

visible_tags = Tag.objects.filter(visible=True, taggit_taggeditem_items__content_type=ContentType.objects.get_for_model(Action), 
action__complete=False # Here
).order_by('name').annotate(action_count=Count('action'))

此外,print queryset.query知道SQL Django为您生成的内容。