子查询与窗口函数:在 ORM 中实现复杂报表聚合
超越简单的 annotate 和 aggregate,使用 Subquery、Window 和 Exists 实现分组内排名、累计和、多表关联聚合。 · 难度:入门 · +10XP
子查询与窗口函数:在 ORM 中实现复杂报表聚合
普通教程只教 Count、Sum。本教程将演示:1) 使用 Subquery 获取每个分类下最新商品的名称;2) 使用 Window + RowNumber 实现分组内排名(如每个部门薪水前三名);3) 使用 Exists 优化 N+1 查询。通过真实场景(电商订单统计、学生成绩排名)让你掌握 ORM 的深层能力,避免写原生 SQL。
from django.db.models import Subquery, OuterRef, Window, F
from django.db.models.functions import RowNumber
# 每个分类下最新商品
latest_per_category = Product.objects.filter(
category=OuterRef('pk')
).order_by('-created_at').values('name')[:1]
Category.objects.annotate(
latest_product=Subquery(latest_per_category)
)
# 订单按金额排名
Order.objects.annotate(
rank=Window(
expression=RowNumber(),
order_by=F('total_price').desc()
)
)