zoukankan      html  css  js  c++  java
  • 三流,内部类,基表,表关系,断开表关联,外键字段属性

    一、三流

    • 三流就是输入输出流和错误流
    • python的print语法底层就是通过这三流实现的
    • print方法中有个end参数,默认是 ,所以我们一个print就会换一次行。

    1. 标准输入流

    import sys
    # 标准输出流
    sys.stdout.write('123
    ')
    sys.stdout.write('456
    ')
    

    2. 标准输入流

    # 标准输入流
    import sys
    res = sys.stdin.readline()
    print(res)
    

    3. 标准错误流

    # 标准错误流
    import sys
    sys.stderr.write('opq
    ')
    sys.stderr.write('xyz
    ')
    

    二、内部类

    • python中,允许一个类中定义其他的类,函数内部定义其他函数(即闭包函数)。但其他语言中,函数内部不能定义其他函数,函数只能单独定义或在类的内部定义,所以其他语言都是函数套类再套函数。
    • 在python中,一个类的内部类,一般都是用来对外层的类进行配置。
    def fn():
        def func():
            pass
    
    class A:
        class B:  # B类的名称可以通过A类来访问
            x = 10
            y = 20
    
    print(A.B.x)  # 结果: 10
    
    
    # python中的内部类实例:
    # 在django项目的models文件中:
    class BaseModel(models.Model):
        is_delete = models.BooleanField(default=False)
        created_time = models.DateTimeField(auto_now_add=True)
    
        class Meta:
            
            abstract = True  # 让BaseModel类 成为基表。
    

    三、基表

    1. 什么是基表

    • 在django的models中,模型类继承的类就是基表。
    • 基表,为抽象表,是专门用来被继承,为继承的模型表提供公有字段的,自身不会完成数据库迁移

    2. 如何定义基表

    • models文件中:
    class BaseModel(models.Model):
        is_delete = models.BooleanField(default=False)
        created_time = models.DateTimeField(auto_now_add=True)
    
        class Meta:
            # 基表,为抽象表,是专门用来被继承,提供公有字段的,自身不会完成数据库迁移
            abstract = True
    

    四、断关联表关系

    1. 为什么要断开关联表关系

    • 在实际开发中,有时候一个项目中的数据表会有很多,有各种外键关联,此时表关系就会很复杂。在进行数据的增删改时会非常繁琐,且后期数据库的重构基本不能实现。因此这时我们就需要断开表关系了。
    • 当然若是数据表较少,则就没必要断开表关系了。

    2. 断开表关系后的优缺点

    (1)优点:

    1. 不会影响连表查询操作效率,即依然可以用没断连接时的连表查询方法,不会有任何影响
    2. 会提升连表增删改操作效率
    3. 易于后期数据库表的重构

    (2)缺点

    1. 缺点在于:数据库本身没有连表检测,容易出现脏数据,需要通过严格的逻辑避免脏数据的产生(必要的时候管理脏数据)

    (3)例子

    举例:
    
    A表依赖B表,先插入A记录,该记录对应的B中记录没产生,在没有关联的情况下,该操作可以实现,但是数据就是脏数据
    
    接着再将B中对应的数据添加,脏数据就得到处理了。反过来先操作B后操作A,更满足逻辑思维,一样可以执行。通过逻辑将A、B表进行连表查询,不会有任何异常
    
    

    五、表关系创建

    1. 如何创建表关系

    • 无论使用什么数据库,创建表关系的规律不变的。

    • 一对多:外键建在多的一方

    • 一对一:外键要根据实际需求建立在合理的位置

    • 多对多:需要第三张表来管理表关系。外键创建在第三张表中。(在django中,创建第三张表的虚拟字段创建在查询频率高度一方)

    2. Django项目中的外键字段的属性

    • 注意:Django项目中,多对多关系表是依靠一个虚拟字段(ManyToMany)来创建的,这个字段不是外键字段,而一对一(OneToOne)的字段其实也是外键字段,所以不能给多对多的虚拟字段设置on_delete属性

    • 暂时掌握3个外键字段属性

      1. related_name
      2. on_delete注意:只能在外键字段中设置
      3. db_constraint

    (1)related_name

    • 在外键中设置反向查询的字段名:正向找按字段名,反向找按related_name设置的值
    • 不设置则反向查询默认是按:表名小写_set

    (2)on_delete

    • 在Django的1.x版本中,系统默认提供(值为models.CASCADE),Django 2.x中,必须手动指定。

    • 共有4种参数:

      1. models.CASCADE

        • 级联。例子:A表依赖B表,B记录删除,A中对应的数据也跟着删除
      2. models.DO_NOTHING

        • 不级联。例子:A表依赖B表,B记录删除,A表中对应的数据不做任何变动
      3. models.SET_DEFAULT

        • 这个是他们中的最不常用的参数

        • 半级联。例子:A表依赖B表,B记录删除,A表中对应的数据的外键字段置为default属性设置的值,所以必须配合default属性使用

      4. models.SET_NULL

        • 半级联。例子:A表依赖B表,B记录删除,A表中对应的数据的外键字段置为null,所以必须配合null=True属性使用

    (3)db_constraint(重点)

    • 在外键字段中控制表关联,默认为True表示关联,设置False表示断开关联
  • 相关阅读:
    oo——第三单元总结
    oo第三单元总结
    【BUAA软工】提问回顾与个人总结
    【BUAA软工】HTTP协议前后端实现及实战北航云盘爬取
    【BUAA软工】软件案例分析
    【BUAA软工】结对编程作业
    【BUAA 软工个人项目作业】玩转平面几何
    【BUAA 软工博客作业】个人博客作业
    【BUAA 软工热身作业】继往开来,勇攀高峰
    BUAA-OO-第四单元总结——终章
  • 原文地址:https://www.cnblogs.com/Mcoming/p/12103399.html
Copyright © 2011-2022 走看看