Django Academy · レッスン

M2M向けのprefetch_related

多対多データを効率的に一括読み込みします

レッスン 3/413 ステップ

「M2M向けのprefetch_related」はCoddyKit上の無料Django Academyレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはDjango Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Django Academyコースには全4レッスンが含まれています。

prefetch_relatedを使う

prefetch_relatedは、many-to-manyや逆向きのリレーションなど、JOINでは扱えない関連をスマートなバッチ処理で処理します。📦

多数ではなく2回のクエリ

巨大なJOINを作る代わりに、関連する行を取得する2回目のクエリを実行し、その結果をPythonで対応付けます。

基本的な呼び出し

先ほどと同じように、リレーション名をprefetch_relatedに渡すと、Djangoが自動的にアクセスをまとめてくれます。

authors = Author.objects.prefetch_related('books')

N+1より2回が優れている理由

著者に対するクエリと、すべての書籍に対するクエリを1回ずつ実行すれば、ループする著者の数に関係なく、アクセスは合計2回です。

for author in authors:
    print(author.books.count())

複数の関連に最適

各オブジェクトが複数の行に関連付けられている場合に使います。many-to-manyフィールドや逆向きの外部キーに最適です。

逆向きのリレーションにも使える

著者からすべての書籍へアクセスする場合など、逆向きのアクセサーで特に効果を発揮します。select_relatedでは対応できません。

2つのツールを組み合わせる

1つのquerysetに両方の最適化手法を連結し、それぞれが最も得意とするリレーションの種類に使い分けられます。

Book.objects.select_related('author').prefetch_related('tags')

Prefetchで制御する

Prefetchオブジェクトを使うと、取得する関連行をフィルターしたり並べ替えたりでき、細かな制御が可能になります。

from django.db.models import Prefetch
Author.objects.prefetch_related(
  Prefetch('books', queryset=Book.objects.filter(year=2024)))

Pythonで処理される

対応付けはSQLではなくPythonで行われます。そのため、大規模なmany-to-manyのJOINで発生する行数の爆発を回避できます。

ループ内のフィルターには注意する

ループ内で事前取得した集合にfilterを呼び出すと、再び新しいクエリが発行されます。バッチ処理のメリットを維持するには、Prefetchを使用してください。

2つのツール、1つの目的

単一の関連にはselect_related、多数の関連にはprefetch_relatedを使用します。これらを組み合わせれば、ほとんどすべてのビューでN+1問題を解消できます。🚀

簡単な確認

このケースに適した最適化手法を選択してください。

まとめ

prefetch_relatedは多対多の関連と逆方向の関連を2つ目のクエリにまとめ、Pythonで対応付けます。完全に対応するにはselect_relatedと組み合わせてください。✅

無料で開始

AI チューターと学ぶ Python — 無料

ブラウザでリアルコードを書いて実行し、24/7 の AI チューターから瞬時にサポートを受け、ウェブまたはアプリで続きから学習できます。

コース
30
レッスン
120

よくある質問

「M2M向けのprefetch_related」レッスンは無料ですか?

はい。「M2M向けのprefetch_related」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Django Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Django Academyコースには全4レッスンが含まれています。

「M2M向けのprefetch_related」で何を学びますか?

多対多データを効率的に一括読み込みします ブラウザで直接実行するハンズオンコードでDjango Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Django Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのDjango Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。

「M2M向けのprefetch_related」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このDjango Academyレッスンでコードを書いて実行できますか?

はい。すべてのDjango Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. N+1問題の発見
  2. ForeignKey向けのselect_related
  3. M2M向けのprefetch_related
  4. Debug Toolbarによるプロファイリング
← Django Academyに戻る