drf中外键关联时related_name详解
在 Django 中,ForeignKey 是一种常见的字段类型,用于表示两个模型之间的一对多关系。related_name 是 ForeignKey 字段的一个可选参数,用于指定反向关系的名称。当你通过外键关联两个模型时,related_name 提供了从“目标模型”访问“源模型”的途径。
related_name 的作用:
related_name指定了反向关系的名称,即从外键指向的目标模型访问源模型的方式。- 如果没有指定
related_name,Django 会自动为你生成一个反向关系的名称,通常是<model_name>_set,你可以通过这个名称访问相关的对象集合。
示例:
假设我们有两个模型:Author 和 Book,其中 Book 模型通过 ForeignKey 字段关联到 Author 模型。
1. 基本外键关联(没有使用 related_name):
from django.db import models
class Author(models.Model):
name = models.CharField(max_length=100)
class Book(models.Model):
title = models.CharField(max_length=200)
author = models.ForeignKey(Author, on_delete=models.CASCADE)
在这个例子中,Book 模型有一个外键字段 author,指向 Author 模型。Django 会自动为反向关系生成 author_set。
# 获取某个作者的所有书籍(反向访问)
author = Author.objects.get(id=1)
books = author.book_set.all() # 'book_set' 是自动生成的反向关系
2. 使用 related_name 指定反向关系名称:
如果你希望为反向关系指定一个自定义名称,可以使用 related_name 参数。我们将它添加到 ForeignKey 字段上。
from django.db import models
class Author(models.Model):
name = models.CharField(max_length=100)
class Book(models.Model):
title = models.CharField(max_length=200)
author = models.ForeignKey(Author, on_delete=models.CASCADE, related_name='books')
现在,我们通过 related_name='books' 指定了反向关系的名称为 books,这样可以更直观地访问某个作者的所有书籍。
# 获取某个作者的所有书籍(反向访问)
author = Author.objects.get(id=1)
books = author.books.all() # 使用自定义的 'books' 反向关系名称
3. 使用 related_name 在多对多关系中的应用:
related_name 同样可以用于 ManyToManyField 和 OneToOneField,它的作用类似。以下是 ManyToManyField 的例子:
class Author(models.Model):
name = models.CharField(max_length=100)
class Book(models.Model):
title = models.CharField(max_length=200)
authors = models.ManyToManyField(Author, related_name='written_books')
在这个例子中,related_name='written_books' 会让我们能够通过 Author 模型访问所有关联的书籍:
# 获取某个作者的所有书籍
author = Author.objects.get(id=1)
books = author.written_books.all() # 使用自定义的 'written_books' 反向关系名称
related_name 的注意事项:
- 避免冲突:
related_name需要确保唯一性。如果多个外键字段使用了相同的related_name,会导致命名冲突。 - 反向查询:通过
related_name,你可以轻松进行反向查询,访问与某个对象关联的多个对象。 related_query_name:除了related_name,还有一个相关的字段叫related_query_name,它用于指定反向查询时的名称,影响filter()查询等操作。
related_query_name 示例:
class Book(models.Model):
title = models.CharField(max_length=200)
author = models.ForeignKey(Author, on_delete=models.CASCADE, related_name='books', related_query_name='book')
这样,我们就可以在查询时使用 book 而不是 books 来进行反向查询:
# 查询书籍
author = Author.objects.get(id=1)
books = author.book.all() # 使用 'book' 作为反向查询名称
总结:
related_name用于指定外键的反向关系名称。- 它提供了通过外键目标模型反向访问源模型的便利。
- 如果不指定
related_name,Django 会自动生成一个默认的名称(通常是<model_name>_set)。 - 使用
related_name可以让代码更加可读和简洁。
希望这能帮助你理解 related_name 的用法!如果有其他问题,随时问我!

浙公网安备 33010602011771号