準備モデルを用意する。今回用意するモデルはこういうモデル。self.tag.name)タグがあって、ブログ記事にタグをつけて分類できるというモデルです。admin画面を用意して、テストデータを手で入れました。BlogTagAdmin)SQLをログに出力する。データの準備ができたので、実際にORMを叩いていきたいところです。その前に、ORMで実行されるSQLが見れるようにして起きましょう。settings.pyに以下の設定を追加します。}}これで、実際にSQLが表示されるようになりました。Python>]>試行select_relatedとりあえず、データを確認します。args=('Python',)1Tagテーブルのid=1はPythonタグです。次に、BlogTagテーブルから、tagのidが1のレコードを取り出してみます。Djangoの記事:<Python>>]>>>一つ目のSQLがBlogTagレコードのを探していて、あとの4つは文字列を出力するために検索してるようですね。これをselect_relatedで取り出すと次のようになります。Djangoの記事:<Python>>]>要するに何が起きたの?というと、select_relatedで指定したテーブル(Tagテーブル)をINNER_JOINしたSQLを実行してくれます。することで、BlogTagレコードの各レコードにひもづくTagレコードを後から検索する必要がなくなります。当然ですが、複数指定することもできます。Djangoの記事:<Python>>]>ただし、今は、BlogTagから辿っているからいいのですが、TagテーブルやBlogテーブルからselect_relatedすることはできません。(none)まあ、当たり前なんですが。いう時にprefetch_relatedを使えます。prefetch_relatedこんな風に使えます。いうDBアクセスがあったとします。Djangoの記事:<ソフトウェア>>]>これは以下の観点で、効率的ではないですね。Blogレコードに対応するBlogTagのレコードを参照する際に、個別にSQL実行している。BlogTagレコードに対応するBlogレコードやTagレコードを参照する際に、個別にSQL実行している。prefetch_relatedを使うことで、SQL実行の数を削減することができます。inでまとめてBlogTagのレコードを取得できています。それでもまだTagテーブルは個別にSQLを実行してしまっています。select_relatedとprefetch_relatedselect_relatedとprefetch_relatedと合わせて、使ってみます。Djangoの記事:<ソフトウェア>>]>少しマシになりました。SQLの数が減らないものかと思います。prefetch_relatedする際に、select_relatedできないの?と思ったりします。(none)とはいえ、これはできません。いう時は、Prefetchオブジェクトを使います。Prefetchオブジェクトこんな風に使えます。Djangoの記事:<ソフトウェア>>]>実行されるSQLは二つになりました。これで、だいぶスッキリしました。終わり今回は、DjangoのORMのprefetch_related/select_related/Prefetchの使い方を説明しました。データ量が少なかったりアクセス数が少ないサービスのリリース初期は、気にならないようなクエリもデータが増えてくると苦しくなってくると思います。いう時は、SQLの最適化を検討しましょう。最後に、アンケートに答えてもらえると励みになります。09:00djangoのSQL実行を最適化する(prefetch_related/select_related/Prefetch)Tweet関連記事2019-01-30忙しい人のためのちょっとだけdjango-rest-frameworkくろのて勉強会に参加してdjango-rest-frameworkを学びました。...2018-12-20djangoのformって結局なんなの?という疑問が解消されたのでformを解説しますあー、djangoのformってそういう役割なのかー、というのが自分...2018-04-29Docker初心者のはじめの一歩Dockerを使うことになりました。Docker初心者&Dockerを実際に触...2018-04-17DjangoのPaginatorDjangoのPaginatorを触ってみる。2019に行ってきました。2018に行ってきました。(30)スターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。