ORM进阶:子查询聚合与公用表表达式(CTE)
通过django-cte和原生Subquery实现复杂的跨表聚合统计。 · 难度:入门 · +10XP
ORM进阶:子查询聚合与公用表表达式(CTE)
很多教程止步于annotate和aggregate,本教程将带你进入更高级的SQL世界。你将学会如何利用django-cte第三方包在Django ORM中编写WITH子句,以递归方式查询树形数据或生成累计聚合。同时,我们也会展示如何使用Subquery配合OuterRef在一个查询中完成跨表多次聚合,避免N+1问题,并使得查询计划更高效。最后会对比原生SQL与ORM实现的性能差异。
from django_cte import With, CTEManager
class Region(models.Model):
name = models.CharField(max_length=100)
parent = models.ForeignKey('self', null=True, on_delete=models.CASCADE)
objects = CTEManager()
cte = With.recursive(lambda cte: Region.objects.filter(parent__isnull=True).union(
Region.objects.filter(parent__in=cte)
))
regions = cte.queryset().with_cte(cte).annotate(...)