Django ORM:外键字段的命名与查询机制解析

1.外键字段命名

在Django项目中,我创建了两张表,其中depart作为外键,与Department表的主键关联

但创建完两张表后,我发现,外键的名字变化了,成了depart_id

为什么定义的是 depart,而表中是 depart_id

在 Django 模型中,当你定义一个外键字段时,例如上面的,Django 会自动在数据库中创建一个名为 depart_id 的字段,而不是 depart。这是因为:

  • depart 是 Django ORM 的字段名:它用于在 Python 代码中表示外键关系,方便你通过 obj.depart 访问关联的 Department 对象。
  • depart_id 是数据库中的字段名:它存储的是外键的实际值(即 Department 表的主键值)。数据库需要这个字段来维护表之间的关系。
  • depart_id 是实际的数据库字段,存储的是 Department 表的主键值(id)。
  • depart 是 Django ORM 提供的抽象字段,用于方便地访问关联的 Department 对象。

2.外键查询机制

基于上面的解释,我们可以在UserInfo表中访问到Department表中的title,例如

其中queryset可以清楚的看到,获得的是UserInfo表中的所有数据,在传递给user_list.html后,我们可以通过obj.depart.title 访问到Department表中的数据

效果

最终展示的是title,而不是存储在mysql表中的id

上面命名部分解释说:depart 是 Django ORM 提供的抽象字段,用于方便地访问关联的 Department 对象

obj.depart.title 的工作原理:

  1. Django 会根据 depart_id 的值,自动查找关联的 Department 对象。
  2. 然后你可以通过 obj.depart 访问 Department 对象的属性和方法

示例

user = UserInfo.objects.get(id=1)

print(user.depart.title) # 输出:研发部

Django 会执行以下操作:

  1. 查找 UserInfo 表中 id=1 的记录,发现 depart_id=1。
  2. 查找 Department 表中 id=1 的记录,获取 title="研发部"。
  3. 返回 title 的值。
相关推荐
CTA量化套保4 小时前
近期零基础量化学习:先分阶段,再用 AI 检查缺口
人工智能·python
清水白石0084 小时前
Python 死锁排查全攻略:从线程卡死到锁依赖定位与工程化修复
linux·网络·python
杨运交5 小时前
[060][调度模块]Redisson vs Redis 原生锁:两种分布式锁实现深度对比
数据库·redis·分布式
FungLeo5 小时前
Node 后端实战 · 列表查询到底怎么写?一个通用 DSL 封装,过滤分页排序一次搞定
数据库·node.js·serverless·dsl 封装·通用列表查询
Elias不吃糖5 小时前
Langfuse 入门:Trace、Prompt、Dataset、Experiment、Evaluator
前端·python·prompt·langfuse
TechWayfarer5 小时前
批量查IP归属地,在线API、脚本、离线库怎么选?三种方案实测对比
网络·python·网络协议·tcp/ip
抓蛙师5 小时前
多租户 tenant_id SQL 注入漏洞分析与应急响应报告
数据库·sql
ACP广源盛139246256735 小时前
Qwen3.8‑2.4T 开源落地@ACP#国产 MoE 私有化部署下 GSV2221 视频转换芯片机遇分析
大数据·数据库·人工智能
资源大佬星 课it5 小时前
重学C++ ,重构你的C++知识体系
vue.js·docker·django
七牛开发者6 小时前
为什么 Go 很适合 AI 辅助开发?
数据库·人工智能·python·elasticsearch·log4j