目錄
基表
基表,為抽象表,是專門用來被繼承,提供公有字段的,自身不會完成數據庫遷移
abstract
class BaseModel(models.Model):
is_delete = models.BooleanField(default=False)
create_time = models.DateTimeField(auto_now_add=True)
class Meta:
# 設置 abstract = True 來聲明基表 作為基表的model 不能在數據庫中有對應的表
abstract = False
外鍵其他參數(重點)
補充:
一對多 - 外鍵放多的一方
一對一 - 從邏輯正反向考慮,如作者表與作者詳情表,作者刪除級聯刪除詳情,詳情刪除作者依舊存在,所以建議外鍵在詳情表中
多對多 - 外鍵在查詢頻率高的一方
db_constraint=False
斷關聯表關系
1)不會影響連表查詢操作效率
2)會提升連表增刪改操作效率
3)易於后期數據庫表的重構
4)缺點在於:數據庫本身沒有連表檢測,容易出現臟數據,需要通過嚴格的邏輯避免臟數據的參數(必要的時候管理臟數據)
舉例:A依賴B,先插入A記錄,該記錄對應的B記錄沒產生,在沒有關聯的情況下,該操作可以實現,但是數據就是臟數據接着再將B數據添加,臟數據就得到處理了。反過來先操作B后操作A,更滿足邏輯思維,一樣可以執行。通過邏輯將AB表進行連表查詢,不會有任何異常
class Book(BaseModel):
authors = models.ManyToManyField(to='Author', db_constraint=False)
# db_constraint在外鍵中控制表關聯,默認為True表示關聯,設置False表示斷開關聯
related_name
# related_name在外鍵中設置外鍵反向查詢的字段名:正向找字段名,反向找related_name值
class Book(BaseModel):
publish = models.ForeignKey(to='Publish', related_name='books')
authors = models.ManyToManyField(to='Author', related_name='books')
on_delete
on_delete在外鍵中必須設置,表示級聯關系
在Django 1.x下,系統默認提供(值為models.CASCADE),Django 2.x下,必須手動明確
publish = models.ForeignKey(
to='Publish',
related_name='books',
db_constraint=False,
on_delete=models.DO_NOTHING, .......
)
注:多對多字段不能設置on_delete級聯關系,默認為級聯,如果要處理級聯關系,需要手動明確關系表,處理
關系表中的多個外鍵
CASCADE:默認值,級聯
例子:作者沒,詳情一定沒,存在沒意義
DO_NOTHING:外鍵不會被級聯
假設A表依賴B表,B記錄刪除,A表的外鍵字段不做任何處理
例子:作者沒,書還是作者寫的 | 出版社沒,書還是該出版社出版的
SET_DEFAULT: 設置為默認值
假設A表依賴B表,B記錄刪除,A表的外鍵字段置為default
屬性設置的值
所以必須配合default
屬性使用
SET_NULL: 設置為null
假設A表依賴B表,B記錄刪除,A表的外鍵字段置為null
所以必須配合null=True
屬性使用
例子:部門沒,部門員工進入未分組部門(注:關聯部門表外鍵可以為空)