Django按外键分组查询order最大值对应的BookingComponent记录ID方法
Django ORM 分组取每组最大值并过滤的实现方案
首先导入所需的ORM函数:
from django.db.models import Max, Subquery, OuterRef
实现代码
# 构造子查询:按booking分组,查询每个booking对应的最大order值 max_order_subquery = BookingComponentModel.objects.filter( booking=OuterRef("booking") ).values("booking").annotate( max_order=Max("order") ).values("max_order") # 外层查询:匹配过滤条件 + order等于对应分组的最大值 target_records = BookingComponentModel.objects.filter( component_type="Soak", status="In Progress", order=Subquery(max_order_subquery) ) # 仅需要ID列表的话可以追加values_list target_ids = target_records.values_list("id", flat=True)
逻辑说明
- 子查询中通过
OuterRef("booking")关联外层查询的booking字段,为每一个booking分组计算对应的最大order值 - 外层查询先过滤符合
component_type='Soak'、status='In Progress'的记录,再匹配其order值是否等于当前booking分组的最大order,最终返回符合所有要求的记录
按照你提供的示例数据表,执行上述查询会得到ID为3、5的记录,如果你预期得到的是ID4、6,可以检查是否过滤条件设置有误。
内容的提问来源于stack exchange,提问作者Lewis
相关产品推荐
相关产品推荐

