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

