如何在Django中跨表使用annotate并按some_string_id分组?
解决方案
因为无法添加外键关联,你可以通过**子查询(Subquery)+ 外部引用(OuterRef)**的方式实现需求,具体写法如下:
1. 导入必要的ORM工具
from django.db.models import Subquery, OuterRef, F, Sum
2. 完整查询代码
如果TableB中每个some_string_id对应唯一一条记录,直接取对应字段值:
TableA.objects.filter(...).values("some_string_id").annotate( something_i_need=Subquery( TableB.objects.filter(some_string_id=OuterRef('some_string_id')) .values('something_i_need')[:1] ) )
如果TableB中同一个some_string_id有多条记录,需要对something_i_need做聚合(比如求和/取最大值):
TableA.objects.filter(...).values("some_string_id").annotate( something_i_need=Subquery( TableB.objects.filter(some_string_id=OuterRef('some_string_id')) .annotate(total=Sum('something_i_need')) .values('total')[:1] ) )
代码说明
OuterRef('some_string_id'):引用外层TableA分组后的some_string_id值Subquery(...):执行子查询,从TableB中匹配对应some_string_id的记录,获取目标字段值[:1]:限制子查询只返回一条结果,避免因多条匹配导致的报错
内容的提问来源于stack exchange,提问作者Epic
相关产品推荐
相关产品推荐

