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

Django如何仅筛选关联外键数量最多的对象?

Django筛选关联数量最多的模型记录

首先修正你的模型拼写错误:ForegnKey应该改为ForeignKey,且CharField必须指定max_length参数:

class MyModel(models.Model):
    field_a = models.IntegerField()
    field_b = models.CharField(max_length=255)
    field_c = models.ForeignKey(MyOtherModel, on_delete=models.CASCADE)

要实现单个查询集筛选出关联MyOtherModel数量最多的所有MyModel记录,可以通过Django ORM的子查询+聚合功能完成,所有逻辑在数据库端执行,不需要多次查询:

from django.db.models import Count, Subquery, OuterRef

# 子查询:统计每个MyOtherModel对应的MyModel记录数
count_subquery = MyModel.objects.values('field_c').annotate(total=Count('id')).values('total')

# 子查询:获取最大的关联记录数
max_total = Subquery(count_subquery.order_by('-total')[:1])

# 子查询:找到所有关联记录数等于最大值的MyOtherModel的id
top_related_ids = MyModel.objects.values('field_c').annotate(total=Count('id')).filter(total=max_total).values('field_c')

# 最终筛选:获取所有属于这些MyOtherModel的MyModel记录
result = MyModel.objects.filter(field_c__in=Subquery(top_related_ids))

逻辑说明

  • 第一步统计每个field_c(即每个MyOtherModel实例)对应的MyModel记录总数
  • 第二步从统计结果中提取最大的关联数值
  • 第三步筛选出所有关联数等于最大值的MyOtherModel的id
  • 最后一步获取所有关联这些MyOtherModel的MyModel记录

拿你的例子来说:如果field_c_id=1对应50条记录(最大值),top_related_ids会返回[1],result就是所有field_c_id=1的MyModel记录。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 18:25:29