Day 73 基表/断关联表关系/级联属性
基表
class BaseModel(models.Model):
class Meta:
# 基表为抽象表,专门用来被继承的,提供公有字段,自身不会完成数据库迁移
abstract = True
断关联表关系
- 不会影响连表查询操作效率
- 会提升连表增删改操作效率
- 易于后期数据库表的重构
- 缺点: 数据库本身没有连表检测,容易出现脏数据,需要通过严格的逻辑避免脏数据的参数(必要的时候管理脏数据)
表关系
- Book和Publish一对多: 外键在多的一方 Book
- Book和Author多对多: 外键在查询频率高的一方 Book
- Author和AuthorDetail一对一: 外键要根据实际需求建立在合理的位置 AuthorDetail
class Book(BaseModel):
name = models.CharField(max_length=32)
price = models.DecimalField(max_digits=10, decimal_places=2)
publish = models.Foreign(to='Publish', related_name='books', db_constraint=False, on_delete='DO_NOTHING', null=True)
authors = models.ManyToMany(to='Author', related_name='books', db_constraint=False)
class Publish(BaseModel):
name = models.CharField(max_length=32)
address = models.CharField(max_length=64)
class Author(BaseModel):
name = models.CharField(max_length=32)
class AuthorDetail(BaseModel):
mobile = models.CharField(max_length=32)
author = models.OneToOneField.CharField(to=Author, related_name='detail', db_constraint=False, on_delete=models.CASCADE)
外键字段属性
related_name
在外键中设置外键反向查询的字段名:反向找related_name
db_constraint
默认为True表示关联,设置False表示断开关联
on_delete
在外键中必须设置,表示级联关系,在Django1.x下,系统默认提供(值为models.CASCADE), Django2.x下,必须手动明确
级联关系
- CASCADE 默认值,级联
- DO_NOTHING 外键不会被级联,假设A表依赖B表,B记录删除,A表的外键字段不做任何处理
- SET_DEFAULT 假设A表依赖B表,B记录删除,A表的外键字段设置为default属性设置的值,所有必须配合default属性使用
- SET_NULL 假设A表依赖B表,B记录删除,A表的外键字段设置为null,所有必须配合null=True属性使用
注意: 多对多字段不能设置on_delete级联关系,默认为级联,如果要处理级联关系,需要手动明确关系表,处理关系表中的多个外键