基于MySQL后端,Django获取每个域名对应的最新健康状态对象
解决方案
要获取每个WLSDomainName对应的最新DomainOverallHealthStatus完整对象,可以用以下两种方法:
方法一:子查询+聚合
先通过子查询找到每个域名对应的最新创建时间,再过滤出匹配该时间的完整记录:
from django.db.models import Subquery, OuterRef, Max # 子查询:获取每个domain_name对应的最新created时间 latest_created_subquery = DomainOverallHealthStatus.objects.filter( domain_name=OuterRef('domain_name') ).values('domain_name').annotate(latest=Max('created')).values('latest') # 过滤出每个域名的最新健康状态记录 latest_health_records = DomainOverallHealthStatus.objects.filter( created=Subquery(latest_created_subquery) )
方法二:Window函数(Django 2.0+)
通过窗口函数按域名分组,按创建时间倒序排序后取每组第一条:
from django.db.models import Window, F from django.db.models.functions import RowNumber # 定义窗口:按domain_name分组,created降序排序 window_clause = Window( partition_by=F('domain_name'), order_by=F('created').desc() ) # 标注行号,过滤出每组第一行(最新记录) latest_health_records = DomainOverallHealthStatus.objects.annotate( row_number=RowNumber().over(window_clause) ).filter(row_number=1)
说明
- 两种方法都能返回包含
DomainOverallHealthStatus所有字段的对象查询集 - 确保
BaseMixin中的created字段是DateTimeField类型,添加数据库索引可进一步提升查询效率
内容的提问来源于stack exchange,提问作者Samrat
相关产品推荐
相关产品推荐

