prefetch_related для M2M
Эффективно загружайте данные связей «многие ко многим» пакетами
«prefetch_related для M2M» — бесплатный урок Django Academy на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Django Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Django Academy содержит 4 уроков всего.
Части этого урока еще не переведены и отображаются на английском.
Meet prefetch_related
prefetch_related handles the relationships a join cannot, like many-to-many and reverse links, with smart batching. 📦
Two Queries, Not Many
Instead of one giant join, it runs a second query for the related rows, then matches them up in Python.
The Basic Call
Pass the relation name to prefetch_related, just like before, and Django batches the lookups for you automatically.
authors = Author.objects.prefetch_related('books')Why Two Beats N+1
One query for authors and one for all their books is two trips total, no matter how many authors you loop over.
for author in authors:
print(author.books.count())Best for Many
Reach for it whenever each object links to multiple rows: many-to-many fields and reverse foreign keys are perfect fits.
Reverse Relations Work
It shines on reverse accessors, like an author reaching all their books, where select_related simply cannot help.
Mixing Both Tools
You can chain both optimizers on one queryset, using each for the relationship type it handles best.
Book.objects.select_related('author').prefetch_related('tags')Control with Prefetch
The Prefetch object lets you filter or order the related rows that get fetched, giving you fine control.
from django.db.models import Prefetch
Author.objects.prefetch_related(
Prefetch('books', queryset=Book.objects.filter(year=2024)))Done in Python
The matching happens in Python, not SQL. That is why it sidesteps the row explosion a big many-to-many join would cause.
Filter Inside the Loop Carefully
Calling filter on a prefetched set inside a loop fires fresh queries again. Use Prefetch to keep the batching benefit.
Two Tools, One Goal
select_related for single links, prefetch_related for many. Together they crush N+1 in almost any view. 🚀
Quick Check
Choose the right optimizer for this case.
Recap
prefetch_related batches many-to-many and reverse links into a second query, matched in Python. Pair it with select_related for full coverage. ✅
Часто задаваемые вопросы
Урок «prefetch_related для M2M» бесплатный?
Да — полный текст урока «prefetch_related для M2M» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Django Academy, подпишись на CoddyKit PRO. Курс Django Academy содержит 4 уроков всего.
Чему я научусь в уроке «prefetch_related для M2M»?
Эффективно загружайте данные связей «многие ко многим» пакетами Ты практикуешь Django Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Django Academy?
Предыдущий опыт не требуется. Django Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.
Сколько времени занимает урок «prefetch_related для M2M»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Django Academy?
Да. Каждый урок Django Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Поиск проблемы N+1
- select_related для ForeignKey
- prefetch_related для M2M
- Профилирование с Debug Toolbar