Django如何按版次关联书籍数量筛选并获取数量最多的前3个版次?
Django 实现统计关联书籍最多的前3个版次
1. 导入所需依赖
首先需要导入Django ORM的聚合计数函数:
from django.db.models import Count
2. 核心查询语句
直接通过Edition模型的ORM查询,使用annotate方法为每个版次对象新增关联书籍计数字段,再倒序排序取前3条即可:
# 统计每个版次关联的书籍数量,按数量倒序取前3 top3_editions = Edition.objects.annotate( book_total=Count('book') ).order_by('-book_total')[:3]
说明:
Count('book')里的book是Book模型的小写名,因为你没有在Book的edition外键字段中指定related_name,ORM默认用关联模型的小写名做跨表查询标识- 如果你在edition外键字段中定义了
related_name,例如edition = models.ForeignKey(..., related_name='books'),则需要把Count('book')改成Count('books')
3. 常见扩展场景
排除没有关联书籍的版次
如果不需要展示关联数量为0的版次,增加filter过滤即可:
top3_editions = Edition.objects.annotate( book_total=Count('book') ).filter(book_total__gt=0).order_by('-book_total')[:3]
4. 结果使用示例
拿到查询集后可以直接遍历使用新增的计数字段:
for edition in top3_editions: # 可替换为Edition模型中实际的名称字段 print(f"版次:{edition.title},关联书籍数:{edition.book_total}")
内容的提问来源于stack exchange,提问作者Ihor
相关产品推荐
相关产品推荐

