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

Django ORM统计song和radio两字段组合播放量play_count恒为1问题

错误原因分析
  • 你当前的写法没有对「电台+歌曲」的组合做分组,annotate是直接作用在单条Airplay播放记录上的,每条记录对应的song和radio组合固定,加上你用了distinct=True统计拼接后的唯一值,最终每条记录的play_count自然只能得到1。
  • 统计逻辑不符合需求:你需要的是「同一电台+同一歌曲」组合下所有播放记录的总条数,不是去重后的组合数量,不需要用到Concat和distinct参数。
正确实现代码

首先通过values()指定分组维度,再对每个分组做计数统计即可:

from django.db.models import Count

# 按 电台+歌曲 分组统计播放次数
play_count_stats = Airplay.objects.values(
    'radio_id', 'song_id',  # 核心分组维度:电台ID、歌曲ID
    'radio__name', 'song__name'  # 可选字段:需要返回电台、歌曲的名称等关联字段时可补充
).annotate(
    play_count=Count('id')  # 统计每个分组下的播放记录总数,直接统计主键即可
).order_by('-play_count')  # 按播放次数倒序排序,正序则去掉字段前的负号
结果说明

返回结果为字典列表,每个字典对应一个「电台+歌曲」的统计项,示例结构如下:

[
    {'radio_id': 1, 'song_id': 101, 'radio__name': '都市音乐台', 'song__name': '晴天', 'play_count': 23},
    {'radio_id': 2, 'song_id': 101, 'radio__name': '流行金曲台', 'song__name': '晴天', 'play_count': 17},
    ...
]

如果需要返回完整的Radio、Song模型对象而非字典,可以搭配select_related和分组逻辑做调整。

内容的提问来源于stack exchange,提问作者A. Nurb

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 08:57:04