• 数据库关系和ORM操作关系分析


    数据库关系分析

    1)之间有关系的两个表,增删改操作会相互影响(效率低),查询操作就是正常的连表操作。

    2)之间有关系的两个表,断开关联,但所有数据保持与原来一致;

    每个表都可以单独操作,增删改操作效率极高,但是容易出现脏数据(开发中完全可以避免);

    由于数据没有任何变化,所以查询的连表操作不会受到任何影响。

    3)Django的ORM支持断关联操作关系表,且所有的操作方式和没有断关联操作一致。

    ORM操作关系分析

    """
    外键位置:
    1)一对多:ForeignKey必须放在多的一方,书与出版社,外键应该放在书表
    2)多对多:ManyToManyField放在任何一方都可以,因为会创建关系表,在关系表中用两个外键分别关联两个表
    3)一对一:OneToOneField放在依赖的表,如作者与作者详情,放在详情表,OneToOneField会被转换为 外键 + 唯一约束
    """
    
    """
    ORM关系Field:
    ForeignKey可以设置related_name, db_constraint, on_delete
    OneToOneField可以设置related_name, db_constraint, on_delete
    ManyToManyField只能设置related_name, db_constraint
        不能设置on_delete的原因:不管是关联的A表,还是B表,数据修改,都会影响到关系表(默认级联),
        如果想控制,只能自定义关系表,在关系表的两个外键分别设置on_delete
    """
    
    """
    参数含义
    related_name:表之间反向访问的名字,默认是 表名小写|表名小写_set
    db_constraint:表之间的关联关系,默认为True,代表关联,设置False,可以提高增删改的效率,且不影响查等其他操作,但增删改会导致脏数据,所以需要通过逻辑或事务来保证
    on_delete:在django 1.x下默认是CASCADE,在django 2.x下必须手动明确
    """
    
    """
    表关系:
    作者没,作者详情一定没:on_delete=models.CASCADE  *****
    作者没,书还是该作者出的:on_delete=models.DO_NOTHING
    部门没,部门内的员工全部进入未分组部门:on_delete=models.SET_DEFAULT (需要配合default属性使用,如default=1)  
    部门没,部门内的员工部门外键字段设置为空:on_delete=models.SET_NULL (需要配合null=True属性使用)  *****
    """

    案例:

    models.py

    class Author(models.Model):
        name = models.CharField(max_length=64)
    
    
    class AuthorDetail(models.Model):
        phone = models.CharField(max_length=11)
        author = models.OneToOneField(
            to=Author,
            related_name='detail',
            db_constraint=False,
            on_delete=models.SET_NULL,
            null=True
        )

    测试文件test.py

    import os, django
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "d_proj.settings")
    django.setup()
    
    from api.models import Author, AuthorDetail
    
    # 测试正向反向查询
    # a1 = Author.objects.first()
    # print(a1.name)
    # print(a1.detail.phone)
    
    # ad2 = AuthorDetail.objects.last()
    # print(ad2.phone)
    # print(ad2.author.name)
    
    # 级联关系测试
    # ad2 = AuthorDetail.objects.last()  # type: AuthorDetail
    # ad2.delete()
    
    # Author.objects.first().delete()
  • 相关阅读:
    Linux下卸载mysql
    ORA-12504: TNS:listener was not given the SERVICE_NAME in CONNECT_DATA
    Centos系统创建用户oracle后,用该用户登陆系统,页面加载报错GConf error
    Java Web 深入分析(6) Tomcat
    CSS 类选择器
    myeclipse 破解
    Java Web 深入分析(5) Java ClassLoader 工作机制
    JFinal(2)JFinal 学习资料
    JFinal(1)JFinal helloworld
    Java Web 深入分析(4) Java IO 深入分析
  • 原文地址:https://www.cnblogs.com/baohanblog/p/12337325.html
Copyright © 2020-2023  润新知