Django taggit 聚合查询 return 每个标签计数

Django taggit aggregation query to return count per tag

我正在使用 Django 3.2 和 django-taggit 1.4

我有这样一个模型:

class Meal(models.Model):
    # some fields
    is_cooked = models.Boolean()
    tags = TaggitManager()

我正在尝试生成一个以标签名称和标签出现次数作为键值的字典 - 但仅适用于 is_cooked 标志设置为 True 的膳食。

我试过以下方法:

pks = list(Meal.objects.filter(is_cooked=True))
ct = ContentType.objects.get_for_model(Meal)
b=TaggedItem.objects.filter(content_type=ct, object_id__in=pks).annotate(num_times=Count('tag__name'))

这没有返回预期的结果(而且我预计它可能会因为查询太多而多次访问数据库 - 但我不想因为过早的优化问题而分心。

我哪里做错了,如何获取每个标签的标签数?

[[编辑]]

以下是 运行 以上查询的结果:

<QuerySet [<TaggedItem: Meal One tagged with rice>, <TaggedItem: Meal Two tagged with chips>, <TaggedItem: Meal Three tagged with curry>, <TaggedItem: Meal Four tagged with royalty>, <TaggedItem: Meal Five tagged with rice>, <TaggedItem: Meal Six tagged with chips>]>


>>> b[0].num_times
1

您可以过滤注释:

from django.db.models import Count, Q
from taggit.models import Tag

Tag.objects.annotate(
    nmeal=Count('meal'<strong>, filter=Q(meal__is_cooked=True)</strong>)
)

从这个查询集中产生的 Tag 对象将有一个额外的属性 .nmeals,其中包含 煮熟的 餐的数量。

如果您只想检索至少有一份相关熟食的 Tag 个对象,您可以使用:

from django.db.models import Count, Q
from taggit.models import Tag

Tag.objects.filter(
    <strong>meal__is_cooked=True</strong>
).annotate(
    nmeal=Count('meal')
)