related_name 与反向查询
双向遍历关联关系
related_name 与反向查询 是 CoddyKit 上的免费 Django Academy 课时。 这是第 4 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Django Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Django Academy 课程共包含 4 节课。
本课时的部分内容尚未翻译,以英文显示。
Links Go Both Ways
You set a ForeignKey from book to author, but you can also walk it backward. A reverse lookup reaches the many side from the one side.
The Default _set Manager
By default Django names the reverse accessor modelname_set. From an author, the books appear as book_set.
author = Author.objects.first()
author.book_set.all()_set Is a Manager
That book_set is a full manager, so you can chain filter, order_by, and count on it just like any query.
author.book_set.filter(published=True).count()Naming with related_name
The _set name is clunky. Set related_name on the ForeignKey to pick a clearer reverse accessor yourself.
author = models.ForeignKey(Author, related_name="books", on_delete=models.CASCADE)A Cleaner Reverse
Now the reverse reads naturally. Instead of book_set you simply write books, which is far easier to follow.
author.books.all()Reverse in Queries
related_name also drives filter across the link. Use the chosen name with the double underscore from the other model.
Author.objects.filter(books__published=True)The Default Query Name
If you skip related_name, the reverse query name is the lowercase model name, like author.objects.filter(book__title=...).
Avoiding Name Clashes
Two ForeignKeys from one model to the same target collide on the reverse name. A distinct related_name on each fixes it.
writer = models.ForeignKey(User, related_name="written", on_delete=models.CASCADE)
editor = models.ForeignKey(User, related_name="edited", on_delete=models.CASCADE)Turning Off the Reverse
Set related_name to a value ending in + to disable the reverse accessor entirely when you never need it.
owner = models.ForeignKey(User, related_name="+", on_delete=models.CASCADE)related_query_name
You can split the names: related_query_name sets the filter name separately from the attribute used to read related rows.
tags = models.ManyToManyField(Tag, related_name="posts", related_query_name="post")Works for Every Relation
related_name applies to ForeignKey, ManyToManyField, and OneToOneField alike, so every reverse path can read clearly.
Quick Check
You set related_name="books" on Book's author ForeignKey. How do you list an author's books?
Recap
You did it! Reverse lookups walk a link backward, and related_name turns clunky _set accessors into clear, readable names. 🔄
常见问题解答
「related_name 与反向查询」课时是免费的吗?
是的 — 「related_name 与反向查询」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Django Academy 课程的其余内容,请升级到 CoddyKit PRO。 Django Academy 课程共包含 4 节课。
「related_name 与反向查询」这节课中我会学到什么?
双向遍历关联关系 你通过在浏览器中直接运行的动手代码来练习 Django Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Django Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Django Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 4 节课,共 4 节。
「related_name 与反向查询」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Django Academy 课中编写并运行代码吗?
能。每节 Django Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- ForeignKey 与 on_delete
- ManyToManyField 与 Through 模型
- 用于配置文件的 OneToOneField
- related_name 与反向查询