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