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

如何用Django ORM按关联对象数量最大值获取对象?

更优实现方案

你可以通过排序后直接取首个结果的方式,减少数据库查询次数,同时让代码更简洁:

from django.db.models import Count

# 注解关联对象数量,按数量降序排序后取第一个实例
primary_with_most_secondary = PrimaryModel.objects.annotate(
    secondary_count=Count('secondarymodel')
).order_by('-secondary_count').first()

对比原方案的优势

  1. 更少的数据库交互:原方案需要3次数据库查询(注解聚合、求最大值、按最大值匹配),而新方案仅需1次查询,性能更优。
  2. 代码更简洁直观:无需单独计算最大值,直接通过排序逻辑获取目标实例。
  3. 多最大值场景的灵活处理:如果存在多个PrimaryModel实例关联数量相同且均为最大值,first()会返回其中一个;若要获取所有这类实例,可结合子查询优化(仅需2次查询):
from django.db.models import Count, Subquery, OuterRef

# 子查询获取最大关联数量
max_count_subquery = PrimaryModel.objects.annotate(
    cnt=Count('secondarymodel')
).order_by('-cnt').values('cnt')[:1]

# 筛选出所有关联数量等于最大值的实例
top_primary_instances = PrimaryModel.objects.annotate(
    secondary_count=Count('secondarymodel')
).filter(secondary_count=Subquery(max_count_subquery))

注意事项

  • 确认secondarymodel是PrimaryModel中关联SecondaryModel的反向关联名称(若ForeignKey未指定related_name,默认名称为secondarymodel_set,你原代码的写法说明已自定义了关联名称)。
  • 若需排除无关联对象的PrimaryModel实例,可在查询链中添加exclude(secondary_count=0)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 09:19:56