簡體   English   中英

除了models.CASCADE 用於Django 模型中的ForeignKey 之外,還有其他on_delete 選項嗎?

[英]Is there any other option for on_delete other than models.CASCADE for a ForeignKey in Django models?

為什么 Django model 中 ForeignKey 的on_delete屬性不是默認值? 如果除models.CASCADE之外沒有其他選項,則應該是這種情況。 on_delete屬性還有其他選項嗎?

是的, on_delete=…參數 [Django-doc]有多個內置處理程序。 該文檔指定:

  • CASCADE級聯刪除。 Django 在ON DELETE CASCADE上模擬 SQL 約束的行為,並刪除包含ForeignKey的 object 。 (……)

  • PROTECT :通過引發 django.db.IntegrityError 的子類ProtectedError來防止刪除引用的django.db.IntegrityError

  • RESTRICT :通過引發RestrictedError ( django.db.IntegrityError 的子類)來防止刪除引用的django.db.IntegrityError PROTECT不同,如果引用的 object 還引用了在同一操作中被刪除但通過 CASCADE 關系的不同 object,則允許刪除引用的 object。 (……)

  • SET_NULL :設置ForeignKey null 這只有在nullTrue時才有可能。

  • SET_DEFAULT :將ForeignKey設置為其默認值; 必須設置 ForeignKey 的default

  • SET(…) :將ForeignKey設置為傳遞給SET()的值,或者如果傳入了可調用對象,則為調用它的結果。 (……)

  • DO_NOTHING :不采取任何行動。 如果您的數據庫后端強制執行引用完整性,這將導致 IntegrityError,除非您手動將 SQL ON DELETE約束添加到數據庫字段。

此外,您還可以為on_delete=…參數編寫自己的處理程序。 例如,在本文中,我討論了實現一個在某種程度上與SET(…)相同的處理程序,但它使用的可調用對象接受應更新的 object 作為參數。

在“早期”, 和之前,您不必設置on_delete=…參數: CASCADE被用作默認值。 但這使得在引用的 object 被刪除的情況下應該發生的事情變得相當隱含,所以后來他們使參數成為強制性參數。

從這里的 djangos 文檔中提取這些: https://docs.djangoproject.com/en/4.0/ref/models/fields/#foreignkey

他們也有代碼示例。

on_delete 的可能值在 django.db.models 中找到:

CASCADE 級聯刪除。 Django 在 DELETE CASCADE 上模擬 SQL 約束的行為,並刪除包含 ForeignKey 的 object。

Model.delete() 不會在相關模型上調用,但會為所有已刪除的對象發送 pre_delete 和 post_delete 信號。

PROTECT 通過引發 django.db.IntegrityError 的子類 ProtectedError 來防止刪除引用的 object。

RESTRICT 通過引發 RestrictedError(django.db.IntegrityError 的子類)來防止刪除引用的 object。 與 PROTECT 不同,如果引用的 object 還引用了在同一操作中被刪除的不同 object,則允許刪除引用的 object,但通過 CASCADE 關系。

SET_DEFAULT 將 ForeignKey 設置為其默認值; 必須設置 ForeignKey 的默認值。

SET() 將 ForeignKey 設置為傳遞給 SET() 的值,或者如果傳入了可調用對象,則為調用它的結果。 在大多數情況下,需要傳遞一個可調用對象以避免在導入 models.py 時執行查詢:

DO_NOTHING 不采取任何行動。 如果您的數據庫后端強制執行引用完整性,這將導致 IntegrityError,除非您手動將 SQL ON DELETE 約束添加到數據庫字段。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM