Django如何按分组获取每组最新的N条记录?
获取Django中每个团队的最新N条记录(N>1)
针对你的Team模型,当需要获取每个团队名称对应的最新N条记录(比如N=3)时,可以利用PostgreSQL支持的窗口函数来实现,Django ORM原生支持这种写法,具体实现如下:
实现思路
通过窗口函数ROW_NUMBER()对每个团队内的记录按created_at倒序编号,然后筛选出编号≤N的记录,即可得到每个团队的最新N条数据。
代码示例(以N=3为例)
from django.db.models import Window, F # 为每条记录添加团队内的行号,再过滤出最新3条 latest_3_per_team = Team.objects.annotate( row_number=Window( partition_by=F('name'), # 按团队名称分组计算行号 order_by=F('created_at').desc() # 组内按创建时间从新到旧排序 ) ).filter(row_number__lte=3)
补充说明
partition_by=F('name'):确保行号是在每个团队内部独立计算,不会跨团队混淆order_by=F('created_at').desc():让团队内最新创建的记录行号为1,依次递减- 若需要最终结果按团队名称和创建时间排序,可在查询末尾追加
.order_by('name', '-created_at')
内容的提问来源于stack exchange,提问作者Johnny Metz
相关产品推荐
相关产品推荐

