django模型中有外键关系的表删除相关设置
0904自我总结
django模型中有外键关系的表删除相关设置
一.一对一
例如有author、authordetail两表
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级联删除
二.一对多
例如book、publish两表
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关联无动作
三.以外键字段关联
1)断关联,删除关联表记录,外键值置空
db_constraint=false, on_delete=models.set_null, null=true,
2)断关联,删除关联表记录,外键值置默认值
db_constraint=false, on_delete=models.set_default, default=1,
注意:on_delete
必须声明models.do_nothing
为删除级联关系, models.cascad
为级联关系,'set_null'置空,set_default
设为默认值
两者区别
- models.set关联表内容删了,关联的相关内容不会删除
- models.cascad关联表内容删了,关联的相关内容会删除
db_constraint
关系断开后,但是不影响联表查询
四.多对多关系
例如book、author两表
authors = models.manytomanyfield(to='author', null=true, related_name='books', db_constraint=false, )
1)关系字段放在任意一方都可以:出版社删除或书删除彼此不影响,但关系表一定级联删除
2)正向找 外键字段,反向找 外键字段related_name
3)db_constraint断开表关联,on_delete不存在(不设置,本质在第三张表中设置,且一定是级联)