模型(主从表)关系 + 模型继承 + Debug Toolbar

模型关系

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,是隐式属性
          • add
          • remove
          • xxx
    • 删除数据
      • 不管主表还是从表数据删除,都不会互相影响
      • 删除自己的数据,并且删除关系表中的数据

模型继承

  • 默认情况下,一个模型在数据库中映射成一张表
  • 如果是继承的模型,在数据库会生成级联表
    • 这样通用数据会在附表中
    • 子表都过外键(本身也是主键)和父表关联
    • 会导致效率地下
  • 如果不想让父模型在数据库生成表
    • 添加元信息
    • 使用抽象属性
    • 抽象的事物是没有对应关系
    • 抽象的模型没有表个它对应

pip

  • pip install xxx
    • 安装软件从官方源,速度比较慢
    • pip install xxx -i YYY
      • YYY = https://pypi.douban.com/simple
      • 从豆瓣源上下载资源

你可能感兴趣的:(django,数据库)