Tiny_Lu
不忘初心

Day 73 基表/断关联表关系/级联属性

基表

class BaseModel(models.Model):
    
    class Meta:
        # 基表为抽象表,专门用来被继承的,提供公有字段,自身不会完成数据库迁移
        abstract = True

断关联表关系

  1. 不会影响连表查询操作效率
  2. 会提升连表增删改操作效率
  3. 易于后期数据库表的重构
  4. 缺点: 数据库本身没有连表检测,容易出现脏数据,需要通过严格的逻辑避免脏数据的参数(必要的时候管理脏数据)

表关系

  1. Book和Publish一对多: 外键在多的一方 Book
  2. Book和Author多对多: 外键在查询频率高的一方 Book
  3. 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级联关系,默认为级联,如果要处理级联关系,需要手动明确关系表,处理关系表中的多个外键

posted @ 2019-12-26 22:07  二二二二白、  阅读(131)  评论(0编辑  收藏  举报