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