0Pricing
Django Academy · Урок

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 — локальная установка не требуется.

Все уроки этого курса

  1. Поиск проблемы N+1
  2. select_related для ForeignKey
  3. prefetch_related для M2M
  4. Профилирование с Debug Toolbar
← Назад к Django Academy