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不存在(不設置,本質在第三張表中設置,且一定是級聯)