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

假设有两个模型:Author和Post,其中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)
相关推荐
外收内放4 小时前
面向对象高级(实战案例)
开发语言·python·学习
专业程序开发源5 小时前
springboot欧缇蔓月子中心管理系统82697-计算机课程设计、毕业设计
java·spring boot·后端·python·spring·django·课程设计
FPGA小迷弟5 小时前
用 Claude Code 重构遗留系统:从评估到落地的完整实践指南
c++·python·ai·plotly·django·ai编程·claude
卷无止境5 小时前
面向arm64桌面客户端开发全景:语言、框架与生态
后端·python
fanruitian5 小时前
python else用法
开发语言·python
Thinker QAQ6 小时前
并发编程(十一):Shared Memory 与 Message Passing——关系与组合使用
java·python·go·并发编程·shared memory·message passing
用户8356290780516 小时前
如何使用 Python 对 Excel 数据进行分组和分级显示
后端·python
vx_Biye_Design6 小时前
django房屋租赁推荐系统78455-计算机课程设计、毕业设计
vue.js·spring boot·后端·python·django·课程设计·express
学Linux的语莫8 小时前
python中类的常见写法
开发语言·python·状态模式
垆边人似月.8 小时前
Python中如何使用get函数实现频次查询
服务器·前端·python