ORM N+1 查询拖慢列表页:select_related 与 prefetch_related 的正确姿势

症状

列表接口 RT 从 80ms 升到 800ms。Django Debug Toolbar 显示 SQL 数量从 3 飙到 203。

定位

外键字段在模板中循环访问,触发 N 次额外查询。

修复

qs = Order.objects.select_related("user", "address") \
                  .prefetch_related("items", "coupons")
return render(request, "orders.html", {"orders": qs})

加分项

只取必要字段:only()/values()

批量统计:annotate() 聚合代替Python 侧遍历。

开启日志统计慢查询。

核对清单

列表页是否访问了外键/多对多字段

是否可通过一次 JOIN/两次批量查询拉齐数据

模板内是否进行了耗时逻辑

这条优化在 gplpal 的电商接口里把 P95 拉回 200ms 内。

评论 0