模型关系
8
1:1
- OneToOneField
- 内部实现
- 使用外键,ForeignKey实现
- 对外键添加了一个唯一约束
- 数据删除
- 默认
- CASECADE
- 当声明关系的表中数据被删除,关联表数据不会受影响
- 当被关联的表中的数据被删除,关联表数据会被级联删除
- PROTECT
- 主表数据如果存在级联数据,主表就不能删除
- 当主表数据不存在级联数据的时候,就是允许删除的
- 推荐使用这种
- SET
- DEFAULT
- NULL
- XX
- 默认
- 主从表
- 声明关系的表就是从表
- 哪张表声明关系,哪张表就相对来说不重要
- 级联数据获取
- 从表获取主表
- 通过显性属性进行获取
- 显性属性是关系,关系就是我们关联到的主表的对象
- 主表获取从表
- 隐性属性就是关联表的模型名(小写)
- 通过隐性属性获得
- 属性值就是从表的对象
- 从表获取主表
- 内部实现
1:M
- ForeignKey
- 内部实现
- 真的就是使用了外键实现的
- 没有了一对一的唯一约束
- 数据删除
- 和一对一保持一致
- SET
- 一定要记得满足SET条件
- NULL 允许为null
- DEFAULT 存在默认值
- 数据查询
- 多获取一
- 使用的显式属性,属性值就是一的对象
- 可以直接使用
- 已获取多
- 使用的隐式属性
- 对象.级联数据_set (级联数据是模型名小写), 是一个Manager对象
- 可以支持Manager筛选操作
- all,filter, exluce, order_by
- Manager支持的操作,都支持
- 支持 remove(关系字段允许为空)
- clear
- add
- 多获取一
- 内部实现
M:N
- 多对多
- 使用ManyToManyField
- 如果两张表的多对多,会生成额外的第三张表,作为关系表
- 关系表中 UNIQUE(xx, yy)
- xx 和 yy 不能同时相等
- (1, 1),(1, 2),(1, 3)
- (2, 1),(2, 2), (2, 3)
- (2, 2) 不能
- 多对多也是用外键实现的
- 在多对多的关系中,使用两个外键实现
- 添加数据
- 从表(声明关系)中的关系字段不再是一个单一的对象了
- 是一个Manager对象
- add
- remove
- clear
- all
- filter
- exclude
- 是一个Manager对象
- 主表中添加数据
- 是一个Manager,是隐式属性
- add
- remove
- xxx
- 是一个Manager,是隐式属性
- 从表(声明关系)中的关系字段不再是一个单一的对象了
- 删除数据
- 不管主表还是从表数据删除,都不会互相影响
- 删除自己的数据,并且删除关系表中的数据
模型继承
- 默认情况下,一个模型在数据库中映射成一张表
- 如果是继承的模型,在数据库会生成级联表
- 这样通用数据会在附表中
- 子表都过外键(本身也是主键)和父表关联
- 会导致效率地下
- 如果不想让父模型在数据库生成表
- 添加元信息
- 使用抽象属性
- 抽象的事物是没有对应关系
- 抽象的模型没有表个它对应
pip
- pip install xxx
- 安装软件从官方源,速度比较慢
- pip install xxx -i YYY
- YYY = https://pypi.douban.com/simple
- 从豆瓣源上下载资源