不为成仙,只为在这红尘中等你回来。

您现在的位置是:网站首页>>Django

Django 模型关系

2019年11月28日 16:31 | 分类:Django | 标签: Django Others

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(可执行对象)
    • 级联数据获取
      • 主获取从 隐性属性,默认就是级联模型的名字
      • 从获取主 显性属性,就是属性的名字

1:N

  • ForeignKey
  • 主从数据获取
    • 主获取从 隐性属性 级联模型_set
      • student_set Manager的子类
        • all
        • filter
        • exclude
        • Manager上能使用的函数都能使用
    • 从获取主
      • 显性属性

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 进行声明

参考: