Django中如何在B模型查询集关联A模型的rating字段
解决方案
你可以通过Django的Subquery和OuterRef来实现,把Model A的rating字段关联到Model B的查询集中,具体步骤如下:
- 先导入需要的ORM工具:
from django.db.models import Subquery, OuterRef
- 构造子查询,匹配B的
id和A的cid,获取对应的rating值:
# 子查询:获取与当前B对象id匹配的A的rating rating_subquery = A.objects.filter(cid=OuterRef('id')).values('rating')[:1]
- 过滤B并通过
annotate把rating字段附加到查询集:
good_rating_B_queryset = B.objects.filter( id__in=A.objects.filter(rating__gt=3).values('cid') ).annotate(rating=Subquery(rating_subquery))
这样处理后,你就能直接通过good_rating_B_queryset.first().rating访问到对应的评分字段了,而且这个方式只会产生两次数据库查询,避免了N+1问题。
注意:如果存在多个A对象的
cid对应同一个B的id,你可能需要调整子查询的逻辑(比如用Avg/Max聚合函数),但根据你描述的id与cid一致的情况,一对一的关联下[:1]是安全的。
内容的提问来源于stack exchange,提问作者user14475872
相关产品推荐
相关产品推荐

