[英]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
; 這只有在null
為True
時才有可能。
SET_DEFAULT
:將ForeignKey
設置為其默認值; 必須設置 ForeignKey 的default
。
SET(…)
:將ForeignKey
設置為傳遞給SET()
的值,或者如果傳入了可調用對象,則為調用它的結果。 (……)
DO_NOTHING
:不采取任何行動。 如果您的數據庫后端強制執行引用完整性,這將導致 IntegrityError,除非您手動將 SQLON DELETE
約束添加到數據庫字段。
此外,您還可以為on_delete=…
參數編寫自己的處理程序。 例如,在本文中,我討論了實現一個在某種程度上與SET(…)
相同的處理程序,但它使用的可調用對象接受應更新的 object 作為參數。
在“早期”, django-1.8和之前,您不必設置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.