如何用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
相关产品推荐
相关产品推荐

