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

如何通过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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 18:50:42