drf-基表、断关联表关系、级联删除、正方向查询、子序列化

基表

为抽象表,是专门用来被继承,提供公有字段的,自身不会完成数据库迁移

class BaseModel(models.Model):
    is_delete = models.BooleanField(default=False)
    created_time = models.DateTimeField(auto_now_add=True)

    class Meta:
       
        abstract = True

断关联表关系

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

外键字段属性

  1. related_name 在外键中设置外键反向查询的字段名:正向找字段名,反向找 related_name
  2. on_delete 在外键中必须设置,表示级联关系;在Django 1.X下,系统自动提供,默认 models.CASCADE ;Django 2.X下,必须手动设置,默认级联;
  • CASCADE:默认值,级联;
  • DO_NATHING:外键不会被级联;
  • SET_DEFAULT:被关联数据被删除,关联数据的外键字段变成 default 的值;
  • SET_NULL:被关联数据被删除,关联数据的外键字段置为 null,必须配置 null = True 使用;
  • 多对多字段不能设置 on_delete 级联关系,默认为级联;
  1. db_constraint 在外键中控制表关联,默认为True,表示关联;
class Book(BaseModel):
    name = models.CharField(max_length=64)
    price = models.DecimalField(max_digits=10, decimal_places=2)
    publish = models.ForeignKey(to='Publish', related_name='books', db_constraint=False, on_delete=models.DO_NOTHING, null=True)
    authors = models.ManyToManyField(to='Author', related_name='books', db_constraint=False)

    def __str__(self):
        return self.name

class Publish(BaseModel):
    name = models.CharField(max_length=64)
    address = models.CharField(max_length=64)

class Author(BaseModel):
    name = models.CharField(max_length=64)

class AuthorDetail(BaseModel):
    mobile = models.CharField(max_length=64)
    author = models.OneToOneField(to=Author, related_name='detail', db_constraint=False, on_delete=models.CASCADE)

子序列化

  1. 只能在序列化中使用;
  2. 字段名必须是外键(正向反向)字段;因为相对于自定义的序列化外键字段,自定义序列化字段是不能参与反序列化的,而子序列化必须为外键名,所以就无法入库;
  3. 在外键关联数据是多条时,需要明确 many = True
  4. 是单向操作,作为子系列的类必须写在上方,不能产生逆向的子序列化;
原文地址:https://www.cnblogs.com/shenblog/p/12103854.html