You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django3.2搭配django-taggit1.4如何统计已烹饪餐食的各标签出现次数

错误原因
  • 参数错误:构造object_id__in过滤条件时,你传入的是Meal实例列表,正确应该传入餐食主键列表:Meal.objects.filter(is_cooked=True).values_list('pk', flat=True)
  • 聚合逻辑错误:你当前的写法是对每行TaggedItem单独做计数,而TaggedItem每行对应「单个餐食+单个标签」的关联关系,因此每行的tag__name只会出现一次,统计结果自然全部为1。你需要先按标签分组,再统计每个分组的总条数,才能得到标签的出现次数。
正确实现方式

方法1:使用django-taggit原生API(推荐,无需手动处理ContentType)

from django.db.models import Count

# 过滤已烹饪的餐食,按标签名称分组统计出现次数
tag_count_query = Meal.objects.filter(is_cooked=True, tags__isnull=False).values(
    "tags__name"
).annotate(
    count=Count("tags__name")
)

# 转为要求的字典格式
result = {item["tags__name"]: item["count"] for item in tag_count_query}

方法2:修正你原有基于TaggedItem的查询逻辑

from django.db.models import Count
from django.contrib.contenttypes.models import ContentType

meal_ct = ContentType.objects.get_for_model(Meal)
cooked_meal_pks = Meal.objects.filter(is_cooked=True).values_list("pk", flat=True)

tag_count_query = TaggedItem.objects.filter(
    content_type=meal_ct,
    object_id__in=cooked_meal_pks
).values(
    "tag__name"
).annotate(
    num_times=Count("tag__name")
)

# 转为要求的字典格式
result = {item["tag__name"]: item["num_times"] for item in tag_count_query}

两种方法得到的result就是你需要的「标签名: 出现次数」字典。


内容的提问来源于stack exchange,提问作者Homunculus Reticulli

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.09 10:45:03