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

如何用Django查询指定Group下每个Hold的最新Amount数据

Django查询:获取Group下每个Hold的最新Amount记录

针对你的模型结构,要实现给定Group实例,获取其关联的每个Hold中creation_time最新的Amount记录,可以用以下两种常见方案:

方案一:使用Subquery和OuterRef

这种方法兼容性较好,适用于大多数Django版本:

from django.db.models import Subquery, OuterRef, Max

# 先获取每个Hold对应的最新creation_time
latest_amount_times = Amount.objects.filter(
    hold_fk=OuterRef('pk')
).values('hold_fk').annotate(
    latest_time=Max('creation_time')
).values('latest_time')

# 过滤出Group下每个Hold的最新Amount
latest_amounts = Amount.objects.filter(
    hold_fk__group_fk=group,  # group是你的Group实例
    creation_time=Subquery(latest_amount_times)
)

逻辑说明:

  • 子查询latest_amount_times先为每个Hold计算出其下Amount的最大creation_time
  • 外层查询筛选出属于目标Group的Hold,且creation_time等于对应Hold最大时间的Amount记录

方案二:使用窗口函数(Django 2.0+)

利用窗口函数给每个Hold下的Amount按creation_time倒序排名,直接取排名第一的记录:

from django.db.models import Window, F
from django.db.models.functions import Rank

# 给每个Hold下的Amount按creation_time倒序排名
ranked_amounts = Amount.objects.filter(
    hold_fk__group_fk=group
).annotate(
    rank=Window(
        expression=Rank(),
        partition_by=F('hold_fk'),
        order_by=F('creation_time').desc()
    )
)

# 筛选出排名第一的记录(即每个Hold的最新Amount)
latest_amounts = ranked_amounts.filter(rank=1)

逻辑说明:

  • partition_by=F('hold_fk')表示按Hold分组
  • order_by=F('creation_time').desc()表示组内按creation_time倒序排列
  • 最终筛选rank=1的记录,就是每个Hold下最新的Amount

两种方法都能实现需求,你可以根据自己的Django版本和性能需求选择。

内容的提问来源于stack exchange,提问作者Epic

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 21:44:58