M2M向けのprefetch_related
多対多データを効率的に一括読み込みします
「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フィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- N+1問題の発見
- ForeignKey向けのselect_related
- M2M向けのprefetch_related
- Debug Toolbarによるプロファイリング