如何通过Django ORM按日期关联查询集并筛选每日最优数据
解决方案
可以利用Django ORM的窗口函数实现单次查询获取目标数据,无需拆分两个查询集再关联。核心逻辑是按date字段分区,对每个分区内的记录按highest_priority排序,筛选出每个分区中排序第一的记录(即当日highest_priority最小的完整数据),既保留所有字段,又保证每日仅返回一条结果。
具体代码实现如下:
from django.db.models import Case, When, Value, Window, F from django.db.models.functions import RowNumber # 定义优先级注解(与原查询集A的逻辑一致) priority_annotate = Case( *[When(data_source=ds, then=Value(i)) for i, ds in enumerate(data_source_order_list)] ) # 主查询:用窗口函数分区排序后筛选目标记录 result = Bids.objects.filter(*args, **kwargs).annotate( highest_priority=priority_annotate, row_num=Window( expression=RowNumber(), partition_by=F('date'), # 按日期分组 order_by=F('highest_priority').asc() # 组内按优先级升序 ) ).filter(row_num=1).order_by('date')
代码说明
partition_by=F('date'):将数据按date字段拆分为独立分组(分区)order_by=F('highest_priority').asc():每个分组内按highest_priority升序排列,确保优先级最小的记录排在首位filter(row_num=1):筛选出每个分组的第一条记录,即当日符合要求的完整数据
该方案仅需一次数据库查询,直接返回包含所有字段的模型实例,完全匹配需求,无需额外关联查询集或使用distinct配合first()/last()。
内容的提问来源于stack exchange,提问作者c0rvvv
相关产品推荐
相关产品推荐

