例若有Author、AuthorDetail两表
python
author = models.OneToOneField(to='Author', null=True, related_name='detail', db_constraint=False, on_delete=models.CASCADE )
1)关系字段放在AuthorDetail表中:做者删除详情删除,详情删除做者保留
2)做者找详情用 外键related_name(detail),详情找做者用 外键字段(author)
3)db_constraint断开表关联,on_delete规定逻辑关联删除动做,models.CASCADE级联删除django
例如Book、Publish两表
code
publish = models.ForeignKey(to='Publish', null=True, related_name='books', db_constraint=False, on_delete=models.DO_NOTHING, )
1)关系字段放在Book表中(多的一方):出版社删除书外键不动,书删除没有任何影响
2)出版社找书用 外键related_name(books),书找出版社 外键字段(publish)
3)db_constraint断开表关联,on_delete规定逻辑关联删除动做,models.DO_NOTHING关联无动做class
1)断关联,删除关联表记录,外键值置空
db_constraint=False, on_delete=models.SET_NULL, null=True,model
2)断关联,删除关联表记录,外键值置默认值
db_constraint=False, on_delete=models.SET_DEFAULT, default=1,总结
注意:on_delete
必须声明models.DO_NOTHING
为删除级联关系, models.CASCAD
为级联关系,'SET_NULL'置空,SET_DEFAULT
设为默认值查询
二者区别db
db_constraint
关系断开后,可是不影响联表查询auth
例如Book、Author两表
co
authors = models.ManyToManyField(to='Author', null=True, related_name='books', db_constraint=False, )
1)关系字段放在任意一方均可以:出版社删除或书删除彼此不影响,但关系表必定级联删除 2)正向找 外键字段,反向找 外键字段related_name 3)db_constraint断开表关联,on_delete不存在(不设置,本质在第三张表中设置,且必定是级联)