当前位置: 首页 > news >正文

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

related_name 的作用

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

默认情况下,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

  1. 提高代码可读性,避免 _set
  2. 多个外键指向同一模型,防止冲突
  3. 增强 API 设计,让反向查询更直观

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

http://www.dtcms.com/a/70053.html

相关文章:

  • 召回度、准确度
  • Java基础面经
  • PyTorch 深度学习实战(14):Deep Deterministic Policy Gradient (DDPG) 算法
  • 【推荐项目】052-用水监控管理系统
  • 【Godot】Window类
  • 【SpringMVC】常用注解:@CookieValue
  • 股票查询系统
  • C#生产型企业ERP系统管理软件PCB行业ERP进销存MRP管理系统BOM管理
  • python---序列 (str,list,tuple)
  • RBAC 模型的简单实现
  • Mamba组件:状态空间模型简介
  • 使用 PerformanceObserver 实现网页性能优化的最佳实践
  • java字符串案例 //要求:将输入的字符串中的数字转换为罗马数字,长度小于9(运用方法:查表法)
  • 目标检测中衡量模型速度和精度的指标:FPS和mAP
  • 2023 年全国职业院校技能大赛(中职组)移动应用与开发赛项 赛题第十套
  • 说说 CDN 的工作原理,它在前端性能优化中起到什么作用?
  • 零基础上手Python数据分析 (4):Python数据结构精讲 - 列表、元组、字典、集合
  • NVM环境下安装pnpm报错的解决方案
  • 项目开发 1-确定选题,制作原型
  • uniapp+vue实现购物车的左滑删除功能
  • BSides-Vancouver-2018 ftp匿名访问、hydra爆破22端口、nc瑞士军刀、提权
  • uniapp-x js 限制
  • 3.14-信号
  • Python Matplotlib面试题精选及参考答案
  • 删除有序数组中的重复项(26)
  • springboot树形结构 支持模糊查询,返回匹配节点和父节点,其他节点不返回
  • Python 基础语法详解
  • 掌握这些 UI 交互设计原则,提升产品易用性
  • Linux内核中断管理总
  • 射频前端模块(FEM)的基本原理与架构:从组成到WiFi路由器的应用