2)之间有关系的两个表,断开关联,但所有数据保持与原来一致;
每个表都可以单独操作,增删改操作效率极高,但是容易出现脏数据(开发中完全可以避免);
由于数据没有任何变化,所以查询的连表操作不会受到任何影响。
3)Django的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()