假设有两个模型:Author
和Post
,其中Post
模型通过ForeignKey
字段与Author
模型相关联。
模型定义
from django.db import modelsclass 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
的反向关系管理器。
使用示例
# 获取一个特定的作者对象
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
参数来指定一个自定义的反向关系名称。
示例
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
对象。
# 获取一个特定的作者对象
author = Author.objects.get(id=1)# 使用自定义的反向关系名称获取该作者的所有文章
posts = author.posts.all()# 打印所有文章的标题
for post in posts:print(post.title)