@kyanny's blog

印刷は人間に対し市場を作り出し、国民軍を創設する方法も教えたのであった - マーシャル・マクルーハン「グーデンベルグの銀河系」

Django: select_related, prefetch_related, Prefetch の使い所

Django: select_related と prefetch_related についてメモ - @kyanny's blog

以前メモしたが、やはり自分で手を動かさないと腹落ちしないので。

サンプルコードと実行例は以下に置いた。

github.com

モデルが Question has many Choice という関係であるとき、

  • select_related は choice.question というアクセスで N+1 クエリが発生するのを防ぐ(JOIN によって)
  • prefetch_related は question.choice_set (choices) というアクセスで N+1 クエリが発生するのを防ぐ(IN によって)
  • Prefetchprefetch_related で関連先をとるときに WHERE で条件を指定したい場合に使う(WHERE question_id IN (...) AND votes = 0)