zoukankan      html  css  js  c++  java
  • DRF 04

    基表

    • 基表只提供公有字段, 不参与数据库迁移
    • 在基表下的配置类class Meta: 中设置: abstract = True, 表明该表为抽象表, 不参与数据库迁移
    # 基表
    class Base(models.Model):  
        is_delete = models.BooleanField(default=False)
        created_time = models.DateTimeField(auto_now=True)
        
        class Meta:
            # 表明该表为抽象表, 只提供公有字段, 不参与数据库迁移 
            abstract = True
    

    外键字段参数

    db_constraint 数据库关联

    • 断关联: db_constraint=False, 既数据库中不会建立外键关系, Django在代码层面上实现两表关联

    • 优点

      • 不会影响连表查询操作效率
      • 可以提升连表增删改效率
      • 易于后期数据库表的重构
    • 缺点

      • 数据库本身没有连表检测, 容易出现脏数据 (需要通过严格的逻辑避免, 必要时管理脏数据)
    class Book(Base):
        name = models.CharField(max_length=64)
        price = models.DecimalField(max_digits=6, decimal_places=2)
        press = models.ForeignKey(to='Press', related_name='books', db_constraint=False, on_delete=models.SET_NULL, null=True)
        authors = models.ManyToManyField(to='Author', related_name='books', db_constraint=False)
    
    
    class Press(Base):
        name = models.CharField(max_length=64)
        addr = models.CharField(max_length=64)
    
    
    class Author(Base):
        name = models.CharField(max_length=64)
        # 逻辑不合理
        # author_detail = models.OneToOneField(to='AuthorDetail')
    
    
    class AuthorDetail(Base):
        mobile = models.CharField(max_length=64)
        author = models.OneToOneField(to=Author, related_name='detail', db_constraint=False, on_delete=models.CASCADE)
    
    """
    在外键字段中设置related_name: 
    1.为反向查询的辅助字段名(正向查询按字段属性, 反向查询按related_name)
    2.related_name可以作为字段名参加序列化类中的fields设置
    """
    

    on_delete 级联关系

    """
    A表依赖B表, b记录删除,
        on_delete=models.CASCADE                    a记录也会被删除
        on_delete=models.DO_NOTHING                 a记录对应外键字段不受影响
        on_delete=models.SET_DEFAULT, default=1     a记录对应外键字段变为默认值
        on_delete=models.SET_NULL, null=True        a记录对应外键字段变为null
        注:多对多外键字段不能修改级联关系, 默认是 on_delete=models.CASCADE
    """
    

    子序列化

    • 只能在序列化类中使用
    • 子序列化的字段名必须是外键字段(正向反向都可以, 包括related_name)
    • 子序列化字段关联多条数据时, 需要明确 many=True
    • 子序列化是单向的, 原因很简单, 一个位置在上, 一个位置在下
    class BookModelSerializer(serializers.ModelSerializer):
        class Meta:
            model = models.Book
            fields = ['name']
    
    
    class PressModelSerializer(serializers.ModelSerializer):
        # 子序列化字段
        books = BookMethodSerializer(many=True)
    
        class Meta:
            model = models.Press
            fields = ['name', 'addr', 'books']
    
    # 使用子序列化的返回结果
    {
        "status": 0,
        "msg": "ok",
        "result": [
            {
                "name": "东方出版社",
                "addr": "上海",
                "books": [
                    {
                        "name": "三体"
                    },
                    {
                        "name": "球状闪电"
                    }
                ]
            },
            {
                "name": "北方出版社",
                "addr": "北京",
                "books": [
                    {
                        "name": "今日简史"
                    }
                ]
            }
        ]
    }
    
    
    -----------------------------------------------------------------------------------------------------
    
    
    # 未使用子序列化的返回结果
    {
        "status": 0,
        "msg": "ok",
        "result": [
            {
                "name": "东方出版社",
                "addr": "上海",
                "books": [
                    1,
                    3
                ]
            },
            {
                "name": "北方出版社",
                "addr": "北京",
                "books": [
                    2
                ]
            }
        ]
    }
    
  • 相关阅读:
    Java实现 蓝桥杯VIP 算法提高 排队打水问题
    Java实现 蓝桥杯VIP 算法提高 排队打水问题
    Java实现 蓝桥杯VIP 算法提高 排队打水问题
    Java实现 蓝桥杯VIP 算法提高 特殊的质数肋骨
    Java实现 蓝桥杯VIP 算法提高 特殊的质数肋骨
    Java实现 蓝桥杯VIP 算法提高 特殊的质数肋骨
    Java实现 蓝桥杯VIP 算法提高 特殊的质数肋骨
    现在使用控件, 更喜欢继承(覆盖控件已有的函数,很奇怪的一种使用方式)
    Controls 属性与继承 TShape 类的小练习(使用TShape可以解决很多图形问题)
    QT创建窗口程序、消息循环和WinMain函数(为主线程建立了一个QEventLoop,并执行exec函数)
  • 原文地址:https://www.cnblogs.com/bigb/p/12105408.html
Copyright © 2011-2022 走看看