Django --- 基表 斷關系 related_name on_delete


基表

基表,為抽象表,是專門用來被繼承,提供公有字段的,自身不會完成數據庫遷移

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值
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屬性使用

例子:部門沒,部門員工進入未分組部門(注:關聯部門表外鍵可以為空)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM