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

如何用单条Django查询获取指定用户列表的最新Purchase记录?

单条查询获取指定用户的最新购买记录

直接用Django的窗口函数就能搞定,不用分组后逐个查询,具体实现如下:

方案一:窗口函数推荐(Django 2.0+)

先导入需要的工具:

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

然后构造查询语句:

latest_purchases = Purchase.objects.filter(
    user__in=list_of_users
).annotate(
    # 给每个用户的购买记录按创建时间倒序排号
    row_num=Window(
        expression=RowNumber(),
        partition_by=F('user'),  # 按用户分组
        order_by=F('created_at').desc()  # 最新的记录排第一
    )
).filter(row_num=1)  # 只取每个用户的第一条(最新)记录

这行代码会生成一条SQL查询,直接返回list_of_users中每个用户的最新购买记录,全程只触发一次数据库请求。

方案二:子查询兼容旧版本

如果你的Django版本低于2.0,不支持窗口函数,可以用子查询实现:

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

# 子查询:获取每个用户的最新购买时间
latest_dates = Purchase.objects.filter(
    user=OuterRef('user')
).values('user').annotate(
    latest_created=Max('created_at')
).values('latest_created')

# 筛选出符合时间条件的记录
latest_purchases = Purchase.objects.filter(
    user__in=list_of_users,
    created_at=Subquery(latest_dates)
)

注意:如果同一个用户在同一时间有多个购买记录,这个方案会返回多条,而窗口函数方案只会返回排序后的第一条,按需选择即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 20:50:30