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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 02:45:31