為什么on_deleteDjango 模型中的 ForeignKey的屬性不是默認的?如果除了models.CASCADE. on_delete物業還有其他選擇嗎?
uj5u.com熱心網友回復:
是的,on_delete=…引數 [Django-doc]有多個內置處理程式。該檔案規定:
CASCADE級聯洗掉。Django 模擬 SQL 約束的行為,ON DELETE CASCADE并洗掉包含ForeignKey. (…)
PROTECT:通過提高ProtectedError的子類來防止洗掉參考的物件django.db.IntegrityError。
RESTRICT:通過提高RestrictedError( 的子類django.db.IntegrityError)來防止洗掉參考的物件。與 不同PROTECT,如果參考的物件還參考了在同一操作中被洗掉的不同物件,但通過 CASCADE 關系,則允許洗掉參考的物件。(…)
SET_NULL: 設定ForeignKeynull; 這只有在null是 時才有可能True。
SET_DEFAULT: 設定ForeignKey為默認值;一default對ForeignKey的必須設定。
SET(…): 將 設定為ForeignKey傳遞給 的值SET(),或者如果傳入的是可呼叫的,則為呼叫它的結果。(…)
DO_NOTHING: 不采取行動。如果您的資料庫后端強制執行參照完整性,除非您手動ON DELETE向資料庫欄位添加 SQL約束,否則這將導致 IntegrityError 。
此外,您還可以為on_delete=…引數撰寫自己的處理程式。例如,在本文中,我討論了實作一個在某種程度上與 a 相同的處理程式,SET(…)但它使用的可呼叫物件接受應該更新的物件作為引數。
在早些時候”, django-1.8之前,您不必設定on_delete=…引數:CASCADE用作默認值。但這使得在參考物件被洗掉的情況下應該發生的事情變得相當隱含,所以后來他們強制使用了該引數。
uj5u.com熱心網友回復:
從 djangos 檔案中提取這些:https ://docs.djangoproject.com/en/4.0/ref/models/fields/#foreignkey
他們也有代碼示例。
on_delete 的可能值可以在 django.db.models 中找到:
CASCADE 級聯洗掉。Django 模擬 SQL 約束 ON DELETE CASCADE 的行為,并洗掉包含 ForeignKey 的物件。
Model.delete() 不會在相關模型上呼叫,但會為所有已洗掉的物件發送 pre_delete 和 post_delete 信號。
PROTECT 通過引發 ProtectedError(django.db.IntegrityError 的子類)來防止洗掉參考的物件。
RESTRICT 通過引發 RestrictedError(django.db.IntegrityError 的子類)來防止洗掉參考的物件。與 PROTECT 不同,如果參考的物件還參考了在同一操作中被洗掉的不同物件,但通過 CASCADE 關系洗掉,則允許洗掉參考的物件。
SET_DEFAULT 將 ForeignKey 設定為其默認值;必須設定 ForeignKey 的默認值。
SET() 將 ForeignKey 設定為傳遞給 SET() 的值,或者如果傳入的是可呼叫的,則為呼叫它的結果。在大多數情況下,需要傳遞一個可呼叫物件以避免在匯入 models.py 時執行查詢:
DO_NOTHING 不采取任何行動。如果您的資料庫后端強制執行參照完整性,除非您手動向資料庫欄位添加 SQL ON DELETE 約束,否則這將導致 IntegrityError。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/384103.html
