如何实现自定义的迁移

  • 分两步实现
    • 生成迁移文件
    • 执行迁移文件
  • 迁移文件的生成
    • 根据models文件生成对应的迁移文件
    • 根据models和已有迁移文件差别 生成新的迁移文件
  • 执行迁移文件
    • 先去迁移记录查找,哪些文件未迁移过
      • app_label + 迁移文件名字
    • 执行未迁移的文件
    • 执行完毕,记录执行过的迁移文件
  • 重新迁移
    • 删除迁移文件
    • 删除迁移文件产生的表
    • 删除迁移记录

模型的对应关系

  • 1 : 1 一对一
  • 1 :N 一对多
  • M :N 多对多

常见的几种数据关系,django都提供了很好的支持

摘要

  • 1:1

    • 应用场景
      • 用于复杂表的拆分
      • 扩展新功能
    • Django中 OneToOneField
      • 使用的时候,关系声明还是有细微差别的
    • 实现
      • 使用外键实现的
      • 对外键添加了唯一约束
    • 数据删除
      • 级联表
        • 主表
        • 从表
        • 谁声明关系谁就是从表
        • 在开发中如何确认主从
          • 当系统遭遇不可避免毁灭时,只能保留一张表,这个表就是你的主表
      • 默认特性(CASECADE)
        • 从表数据删除,主表不受影响
        • 主表数据删除,从表数据直接删除
      • PROTECT 受保护
        • 开发中为了防止误操作,我们通常会设置为此模式
        • 主表如果存在级联数据,删除动作受保护,不能成功
        • 主表不存在级联数据,可以删除成功
      • SET
        • SET_NULL
          • 允许为NULL
        • SET_DEFAULT
          • 存在默认值
        • SET()
          • 指定值
      • 级联数据获取
        • 主获取从 隐性属性 默认就是级联模型的名字
        • 从获取主,显性属性,就是属性的名字
  • 1:M

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

    • 实际上最复杂

    • 开发中很少直接使用多对多属性,而是自己维护多对多的关系

    • 产生表的时候会产生单独的关系表

      • 关系表中存储关联表的主键,通过多个外键实现的
      • 多个外键值不能同时相等
    • 级联数据获取

      • 从获取主
        • 使用属性,属性是一个Manager子类
      • 主获取从
        • 隐性属性
          • 也是Manager子类,操作和从操作主完全一样
    • 级联数据

      • add
      • remove
      • clear
      • set
  • ManyRelatedManager

    • 函数中定义的类
    • 并且父类是一个参数
    • 动态创建

1 : 1

使用models.OneToOneField()进行关联

1
2
3
class Card(models.Model):
person = models.OneToOneField(Person)

绑定卡与人的一对一关系,默认情况下,当人被删除的情况下,与人绑定的卡就也删除了,这个可以使用on_delete进行调整

  • on_delete
    • models.CASCADE 默认值
    • models.PROTECT 保护模式
    • models.SET_NULL 置空模式
    • models.SET_DEFAULT 置默认值
    • models.SET() 删除的时候重新动态指向一个实体

访问对应元素 person.pcard

1 : N 和 M :N

1 : N

使用models.ForeignKey关联

删除时同 1 : 1

获取对应元素 grade.student_set

M : N

使用models.

删除会删除指定对象和关系表中的关系映射

获取对应元素Goods和Buyer

goods. buyer_set

buyer. bgoods

买家添加buyer.bgoods.add 买家清空buyer.bgoods.clear

买家移除buyer.bgoods.remove

Models的面向对象

django中的数据库模块提供了一个非常不错的功能,就是支持models的面向对象,可以在models中添加Meta,指定是否抽象,然后进行继承。

1
2
3
4
5
6
7
class Animal(models.Model):
xxx
class Meta:
abstract = True/False

class Dog(Animal):
xxx
  • 默认继承是会将通用字段放到父表中,特定字段放在自己的表中,中间使用外键连接
    • 关系型数据库关系越复杂,效率越低,查询越慢
    • 父类表中也会存储过多的数据
  • 使用元信息来解决这个问题
    • 使模型抽象化
    • 抽象的模型就不会在数据库中产生映射了
    • 子模型映射出来的表直接包含父模型的字段

思维导图

1YVaCQ.png