【后端】【django】【related_name】`related_name` 的作用

related_name 用于 Django 的 ForeignKeyOneToOneField ,用于 反向访问 关联模型的数据。

默认情况下,Django 会自动生成一个反向关系的名字,但如果多个外键指向同一个模型,就可能发生命名冲突。related_name 允许我们自定义反向查询的名称,提升代码的可读性。


举例说明

python 复制代码
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)
反向查询
python 复制代码
author = Author.objects.get(id=1)
author.book_set.all()  # 通过默认的 `book_set` 访问书籍列表

Django 默认会用 模型名小写 + _set 作为反向查询名称(book_set)。


python 复制代码
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")
反向查询
python 复制代码
author = Author.objects.get(id=1)
author.books.all()  # 现在可以用 `books` 访问,而不是 `book_set`

这里,related_name="books"Author 可以直接通过 .books 访问其所有的 Book 记录。


避免多个外键冲突

当一个模型有多个外键指向同一个模型时,必须使用 related_name 来区分:

python 复制代码
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")
反向查询
python 复制代码
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()
  1. 提高代码可读性 ,避免 _set
  2. 多个外键指向同一模型,防止冲突
  3. 增强 API 设计,让反向查询更直观

这样,我们就可以更清晰、更直观地操作 Django 的外键关联数据! 🚀

相关推荐
Paraverse_徐志斌2 小时前
MySQL 线上大表 DDL 如何避免锁表(pt-online-schema-change)
数据库·mysql·ddl·mysql锁·锁表·pt-osc
哈哈幸运3 小时前
MySQL运维三部曲初级篇:从零开始打造稳定高效的数据库环境
linux·运维·数据库·mysql·性能优化
愚公搬代码3 小时前
【愚公系列】《Python网络爬虫从入门到精通》055-Scrapy_Redis分布式爬虫(安装Redis数据库)
数据库·爬虫·python
pwzs3 小时前
深入浅出 MVCC:MySQL 并发背后的多版本世界
数据库·后端·mysql
大熊猫今天吃什么4 小时前
【一天一坑】空数组,使用 allMatch 默认返回true
前端·数据库
双叶8364 小时前
(51单片机)LCD显示数据存储(DS1302时钟模块教学)(LCD1602教程)(独立按键教程)(延时函数教程)(I2C总线认识)(AT24C02认识)
c语言·数据库·单片机·嵌入式硬件·mongodb·51单片机·nosql
XY.散人4 小时前
初识Redis · C++客户端list和hash
数据库·redis·缓存
码上飞扬4 小时前
深入 MySQL 高级查询:JOIN、子查询与窗口函数的实用指南
数据库·mysql
海洋与大气科学5 小时前
【matlab】地图上的小图
开发语言·数据库·matlab
Geek__19926 小时前
Sqlite3交叉编译全过程
jvm·数据库·sqlite