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

如何在Django ORM中统计各用户的标签及标签使用数量

解决Django中按用户统计标签使用次数的问题

嘿,我来帮你搞定这个标签统计的需求!针对你用django-taggit定义的Post模型,要按用户分组统计每个标签的使用次数,我们可以通过关联django-taggit的TaggedItem中间表来实现,具体步骤如下:

核心思路

django-taggit的TaggableManager本质是通过TaggedItem中间表关联Post和Tag模型的。我们可以直接查询这个中间表,关联到对应的Post和User,再按用户+标签的组合分组计数,最后整理成你需要的字典格式。

具体实现代码

1. 编写ORM查询语句

先导入所需模型,然后构造统计查询:

from django.contrib.auth.models import User
from django.db.models import Count
from taggit.models import TaggedItem
from .models import Post  # 替换成你的Post模型所在路径

# 构造查询:筛选Post模型的标签,按用户和标签分组计数
tag_stats = TaggedItem.objects.filter(
    content_type__model='post'  # 只处理Post模型关联的标签
).values(
    'content_object__user__username',  # 关联到用户的用户名
    'tag__name'  # 标签名称
).annotate(
    tag_count=Count('tag')  # 统计每组标签的使用次数
).order_by('content_object__user__username')

2. 转换为预期的字典格式

查询结果是一个QuerySet,我们遍历它来生成嵌套字典:

result = {}
for item in tag_stats:
    username = item['content_object__user__username']
    tag_name = item['tag__name']
    count = item['tag_count']
    
    # 初始化用户对应的标签字典(如果不存在)
    if username not in result:
        result[username] = {}
    result[username][tag_name] = count

运行后result就会完全匹配你想要的格式:

{
    'user1': {'python':2, 'java':1, 'js':2, 'c':1},
    'user2': {'c':1,'java':1,'js':1}
}

补充说明

  • 如果你用了自定义User模型,只需要把content_object__user__username替换成自定义模型的用户名字段即可(比如content_object__user__email)。
  • content_type__model='post'里的post是Post模型在Django中的小写模型名,如果模型名称有修改,需要对应调整。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:17:36