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 的工作原理:
- Django 会根据 depart_id 的值,自动查找关联的 Department 对象。
- 然后你可以通过 obj.depart 访问 Department 对象的属性和方法
示例
user = UserInfo.objects.get(id=1)
print(user.depart.title) # 输出:研发部
Django 会执行以下操作:
- 查找 UserInfo 表中 id=1 的记录,发现 depart_id=1。
- 查找 Department 表中 id=1 的记录,获取 title="研发部"。
- 返回 title 的值。