模型关系
1:1
- 应用场景
- 用于复杂表的拆分
- 扩展新功能
- Django 中
OneToOneField
- 使用的时候,关系声明还是有细微差别的
- 实现
- 使用外键实现的
- 对外键添加了唯一约束
- 数据删除
- 级联表
- 主表
- 从表
- 谁声明关系谁就是从表
- 在开发中如何确认主从
- 当系统遭遇不可避免的毁灭时,只能保留一张表,这个表就是你的主表
- 默认特性(CASCADE)
- 从表数据删除,主表不受影响
- 主表数据删除,从表数据直接删除
- PROTECT (
on_delete=models.PROTECT
)- 开发中为了防止误操作,我们通常会设置此模式
- 主表如果存在级联数据,删除动作受保护,不能成功
- 主表不存在级联数据,可以删除成功
- SET
SET_NULL
:删除关联数据,与之关联的值设置为null(前提FK字段需要设置为可空,一对一同理)SET_DEFAULT
:删除关联数据,与之关联的值设置为默认值(前提FK字段需要设置默认值,一对一同理)SET
:删除关联数据- a. 与之关联的值设置为指定值,设置:
models.SET(值)
- b. 与之关联的值设置为可执行对象的返回值,设置:
models.SET(可执行对象)
- a. 与之关联的值设置为指定值,设置:
- 级联数据获取
- 主获取从 隐性属性,默认就是级联模型的名字
- 从获取主 显性属性,就是属性的名字
- 级联表
1:N
ForeignKey
- 主从数据获取
- 主获取从 隐性属性 级联模型_set
- student_set Manager的子类
- all
- filter
- exclude
- Manager上能使用的函数都能使用
- student_set Manager的子类
- 从获取主
- 显性属性
- 主获取从 隐性属性 级联模型_set
M:N
- 实际上最复杂
- 开发中很少直接使用多对多属性,而是自己维护多对多的关系
- 产生表的时候会产生单独的关系表
- 关系表中存储关联表的主键,通过多个外键实现
- 多个外键值不能同时相等
- 级联数据
- add
- remove
- clear
- set
模型继承
- Django中模型智齿继承
- 默认继承是会将通用字段放到父表中,特定字段放在自己的表中,中间使用外键连接
- 关系型数据库关系越复杂,效率越低,查询速度越慢
- 父类表中也会存储过多的数据
- 使用元信息来解决这个问题
- 使模型抽象化
class Meta:
abstract = True
- 抽象的模型就不会在数据库中产生映射了
- 子模型映射出来的表直接包含父模型的字段
- 使模型抽象化
model->SQL和SQL->model
- model->SQL
python manage.py makemigrations
python manage.py migrate
- SQL->model
- Django也提供了很好的支持
python manage.py inspectdb
- 可以直接根据数据库表生成模型
- 元信息中包含一个属性
managed=False
,Django 将不会为当前 model 创建或者删除数据库表
- 如果自己的模型不想被迁移系统管理,也可以使用
managed=False
进行声明