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')
)
我正在使用 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')
)