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
相关产品推荐
相关产品推荐

