django之反向关系查询<related_model>_set/related_name

假设有两个模型:AuthorPost,其中Post模型通过ForeignKey字段与Author模型相关联。

模型定义
python 复制代码
from django.db import models

class Author(models.Model):
    first_name = models.CharField(max_length=30)
    last_name = models.CharField(max_length=30)

class Post(models.Model):
    title = models.CharField(max_length=100)
    content = models.TextField()
    author = models.ForeignKey(Author, on_delete=models.CASCADE)
    created_at = models.DateTimeField(auto_now_add=True)

在这个例子中,Post模型有一个ForeignKey字段author,指向Author模型。这意味着每个Post对象都与一个Author对象相关联。

反向关系查询

通过反向关系查询,可以从Author对象获取所有与之相关联的Post对象。默认情况下,Django会为你创建一个名为post_set的反向关系管理器。

使用示例
python 复制代码
# 获取一个特定的作者对象
author = Author.objects.get(id=1)

# 使用反向关系查询获取该作者的所有文章
posts = author.post_set.all()

# 打印所有文章的标题
for post in posts:
    print(post.title)

在这个示例中,author.post_set.all()返回的是一个QuerySet,包含了所有与该Author对象相关联的Post对象。

自定义反向关系名称

如果不喜欢默认的<related_model>_set命名方式,可以在定义ForeignKey字段时使用related_name参数来指定一个自定义的反向关系名称。

示例
python 复制代码
class Post(models.Model):
    title = models.CharField(max_length=100)
    content = models.TextField()
    author = models.ForeignKey(Author, on_delete=models.CASCADE, related_name='posts')
    created_at = models.DateTimeField(auto_now_add=True)

现在可以使用自定义的反向关系名称posts来获取与某个Author对象相关联的所有Post对象。

python 复制代码
# 获取一个特定的作者对象
author = Author.objects.get(id=1)

# 使用自定义的反向关系名称获取该作者的所有文章
posts = author.posts.all()

# 打印所有文章的标题
for post in posts:
    print(post.title)
相关推荐
没有bug.的程序员38 分钟前
Java 字节码:看懂 JVM 的“机器语言“
java·jvm·python·spring·微服务
下午见。2 小时前
Python基础入门:用Anaconda搭建环境的启蒙之旅
python
我叫汪枫3 小时前
Python 办公自动化入门:玩转 Excel 与 Word
python·word·excel
E_ICEBLUE3 小时前
三步完成 Markdown 到 Word/PDF 的转换:Python 教程
python·pdf·word·markdown·格式转换
后台开发者Ethan4 小时前
LangGraph ReAct应用
python·langgraph
f***68604 小时前
问题:Flask应用中的用户会话(Session)管理失效
后端·python·flask
爱吃面条的猿4 小时前
Python修改pip install 指定安装包的路径和默认镜像源
linux·python·pip
饭饭大王6664 小时前
Python 模块的概念与导入:从基础语法到高级技巧
java·服务器·python
Sunhen_Qiletian5 小时前
python语言应用实战--------网络爬虫篇 第二篇(selenium库)
爬虫·python·selenium