0Pricing
Django Academy · 课时

用于多对多关系的 prefetch_related

高效地批量加载多对多数据

用于多对多关系的 prefetch_related 是 CoddyKit 上的免费 Django Academy 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 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」课时是免费的吗?

是的 — 「用于多对多关系的 prefetch_related」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Django Academy 课程的其余内容,请升级到 CoddyKit PRO。 Django Academy 课程共包含 4 节课。

「用于多对多关系的 prefetch_related」这节课中我会学到什么?

高效地批量加载多对多数据 你通过在浏览器中直接运行的动手代码来练习 Django Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Django Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 Django Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 4 节。

「用于多对多关系的 prefetch_related」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 Django Academy 课中编写并运行代码吗?

能。每节 Django Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 发现 N+1 问题
  2. 用于外键的 select_related
  3. 用于多对多关系的 prefetch_related
  4. 使用调试工具栏进行性能分析
← 返回 Django Academy