zoukankan      html  css  js  c++  java
  • 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. 是单向操作,作为子系列的类必须写在上方,不能产生逆向的子序列化;
  • 相关阅读:
    mac Redis相关配置,安装,启动,环境的配置。
    MySQL设置global变量和session变量的两种方法详解
    关于MySQL的锁以及数据脏读,重复读,幻读的笔记。
    MySQL新增数据,存在就更新,不存在就添加(转帖加实测)
    selenium 的显示等待和隐式等待的区别(记录加强版)
    MySQL字段与表的注释。转帖
    mysql格式化日期(转帖)
    通过Python用pymysql,通过sshtunnel模块ssh连接远程数据库。
    java io流
    openID 无效
  • 原文地址:https://www.cnblogs.com/shenblog/p/12103854.html
Copyright © 2011-2022 走看看