后端djangorelated_namerelated_name-的作用
目录
【后端】【django】【related_name】related_name
的作用
related_name
的作用
related_name
用于 Django 的
ForeignKey
和
OneToOneField
,用于
反向访问
关联模型的数据。
默认情况下,Django 会自动生成一个反向关系的名字,但如果多个外键指向同一个模型,就可能发生命名冲突。
related_name
允许我们自定义反向查询的名称,提升代码的可读性。
举例说明
① 默认情况(不使用 related_name
)
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)
反向查询
author = Author.objects.get(id=1)
author.book_set.all() # 通过默认的 `book_set` 访问书籍列表
Django 默认会用
模型名小写 +
_set
作为反向查询名称(
book_set
)。
② 使用 related_name
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")
反向查询
author = Author.objects.get(id=1)
author.books.all() # 现在可以用 `books` 访问,而不是 `book_set`
这里,
related_name="books"
让
Author
可以直接通过
.books
访问其所有的
Book
记录。
③ 避免多个外键冲突
当一个模型有多个外键指向同一个模型时,必须使用
related_name
来区分:
class Employee(models.Model):
name = models.CharField(max_length=100)
class Task(models.Model):
title = models.CharField(max_length=200)
assigned_to = models.ForeignKey(Employee, on_delete=models.CASCADE, related_name="assigned_tasks")
created_by = models.ForeignKey(Employee, on_delete=models.CASCADE, related_name="created_tasks")
反向查询
employee = Employee.objects.get(id=1)
# 该员工创建的任务
employee.created_tasks.all()
# 该员工被分配的任务
employee.assigned_tasks.all()
如果不使用
related_name
,Django 会报错,因为
task_set
这个默认的反向名称会有两个。
总结
情况 | 默认反向查询 | 自定义 related_name 反向查询 |
---|---|---|
单个外键 | book_set.all() | books.all() |
多个外键(指向同一模型) | 冲突,必须指定 | assigned_tasks.all() / created_tasks.all() |
提高可读性 | author.book_set.all() | author.books.all() |
何时使用 related_name
- 提高代码可读性
,避免
_set
- 多个外键指向同一模型 ,防止冲突
- 增强 API 设计 ,让反向查询更直观
这样,我们就可以更清晰、更直观地操作 Django 的外键关联数据! 🚀