Django 6.1 的 FETCH_PEERS 对上我手写的 select_related
来源:dev.to — 2026-11-10
📋 概述
Django 6.1 引入 fetch 模式:开了 FETCH_PEERS 之后,碰到一个对象的外键时,Django 会一次性把这个查询集里所有对象的该关系都加载进来,经典 N+1 循环变成两次查询,不用再写 select_related。作者的足球竞猜站 ExtraTime 有 621 个 select_related、103 个 prefetch_related 和 6635 个测试,他把新版本装进一份代码副本,加了统计每请求 SQL 数的中间件,跑了六组对照实验,看新机制能顶掉多少手工调优。
🔑 核心要点
- 实验设计是六轮对照:原样、禁 select_related、禁后开 FETCH_PEERS、两者都禁、只开新机制、原样加新机制。
- 不是全局开关:只能按 queryset 用 .fetch_mode() 或在 manager 上设。
- 逐路由看,新机制始终没能完全追上手工调优的代码。
- 有的 prefetch 花掉的比省下的多,测试把行为差异抓了出来。
💡 金句
“The classic N+1 loop becomes 2 queries without you writing select_related.”
译:经典的 N+1 循环变成两次查询,而你不用写 select_related。
👍 0
👎 0
← 返回 dev.to 首页