@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)