django Model部分(二)

set global time_zone='+8:00';
show variables like '%time_zone%';

1 迁移

  • 分两步
    • 生成迁移文件
    • 执行迁移文件
  • 迁移文件的生成
    • 根据 models 文件生成对应的迁移文件
    • 根据 models 和已有迁移文件进行对比,生成新的迁移文件
  • 执行迁移文件
    • 先去迁移记录中查找哪些文件没有迁移过
      • app_label + 迁移文件名
    • 执行未迁移文件
    • 执行完毕,记录执行过的迁移文件
  • 重新迁移
    • 1 删除迁移文件
    • 2 删除表
    • 3 删除迁移记录

2 mysql中的关系

2.1 一对一关系
  • models.OneToOneField() 进行关联
    • 常见使用场景
      • 拆分,某一张表过于冗长,需要拆分;
      • 扩展,扩展某张表的功能,使两张表的数据一一对应;
    • 使用时,关系声明有细微差别;
    • 使用外键实现,对外键添加了唯一约束;
    • 谁申明关系,谁就是从表;
  • 由于使用了外键进行关联,所以不需要进行重复查询,直接通过属性就能获取值
    • 即,级联数据获取
    • 如 id_person 是 idCard 表中的外键(一对一也是通过外键实现的)
    • 通过如下代码可以获得 Person 表中的整条数据,无需再次搜索
    person = idCard.id_person
    
    • 主获取从是隐性属性,默认就是级联模型的名字
    • 从获取主是显性属性,就是显性的名字
2.3 一对多
  • ForeignKey
  • 主从获取
    • 主获取从是隐性属性,级联模型_set
      • student_set Manager的子类
        • all
        • filter
  • 从获取主
    • 显性属性
2.4 多对多
  • 实际开发中很少直接使用,而是自己维护
  • 产生表的时候会产生单独的关系表
    • 关系表中存储关联表的主键
    • 通过多个外键实现的
    • 外键不能同时相等
  • ManyRelatedManager 源码类
2.5 on_delete 的值的使用
on_delete=None,               # 删除关联表中的数据时,当前表与其关联的field的行为

on_delete=models.CASCADE,     # 删除关联数据,与之关联也删除
# 从表删除数据,主表不受影响;
# 主表删除数据,从表一同删除;

on_delete=models.DO_NOTHING,  # 删除关联数据,什么也不做

on_delete=models.PROTECT,     # 删除关联数据,引发错误ProtectedError,防止误删
# 如需删除,需要先将级联数据删除,方能进行删除

# models.ForeignKey('关联表', on_delete=models.SET_NULL, blank=True, null=True)
on_delete=models.SET_NULL,    # 删除关联数据,与之关联的值设置为null
# 前提FK字段需要设置为可空,一对一同理

# models.ForeignKey('关联表', on_delete=models.SET_DEFAULT, default='默认值')
on_delete=models.SET_DEFAULT, # 删除关联数据,与之关联的值设置为默认值
# 前提FK字段需要设置默认值,一对一同理

on_delete=models.SET,         # 删除关联数据,
# a. 与之关联的值设置为指定值,设置:models.SET(值)
# b. 与之关联的值设置为可执行对象的返回值,设置:models.SET(可执行对象)
2.6 指定 App 进行数据迁移
  • python manage.py makemigrations AppName
    • 如 python manage.py makemigrations App
2.7 模型继承
  • 默认继承会将通用字段放到父表中,特定字段放在子表中,使用外键进行连接;
    • 关系越复杂,查询效率越低;
    • 父类表中会存储过多数据造成效率低下;
  • 使用元信息来解决问题;
    • 使模型抽象化;
    • 抽象的模型不会在数据库中产生映射;
    • 子模型映射直接包含父模型字段;
    class Animal(models.Model):
        a_name = models.CharField(max_length=16)
    
        class Meta:
            # 在做成抽象的后,就不会在数据库中产生映射
            # animal 表并没有生成
            abstract = True
    
    
    class Cat(Animal):
        c_eat = models.CharField(max_length=32)
    
    
    class Dog(Animal):
        dog_legs = models.IntegerField(default=4)
    
2.8 在企业开发中
  • model => sql
  • sql => model
    • django 也提供了支持;
    • python manage.py inspectdb > App/models.py
      • 需要先删除原有的 models 文件;
      • 可以直接根据表生成模型;
      • 元信息中包含一个属性,manage = False,无法被 django 的迁移管理;
  • 如果某个表不想被 django 管理,也可以这么做;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值