級聯刪除是指在數據庫中刪除一個對象時,與該對象有關的其他對象也被自動刪除。在 Django 中,級聯刪除通常通過在模型中定義外鍵時使用 on_delete 參數來實現。以下是一些常見的 on_delete 選項:
1.models.CASCADE: 當關聯的對象被刪除時,刪除包含外鍵的對象。這是級聯刪除的默認選項。
class OtherModel(models.Model):user = models.ForeignKey(MyUser, on_delete=models.CASCADE)
在這個例子中,如果刪除與 OtherModel 關聯的 MyUser 對象,相關的 OtherModel 對象也將被刪除。
2.多級聯刪除: 如果你有多個模型之間存在多級關系,級聯刪除會依次傳播。例如,如果有三個模型 A、B、C,A 與 B 有外鍵關系,B 與 C 有外鍵關系,如果刪除 A,則 B 和 C 中相關的對象也會被刪除。
class B(models.Model):a = models.ForeignKey(A, on_delete=models.CASCADE)class C(models.Model):b = models.ForeignKey(B, on_delete=models.CASCADE)
刪除 A 對象時,與 A 關聯的 B 對象也將被刪除,進而與 B 關聯的 C 對象也會被刪除。
3.models.PROTECT: 防止刪除關聯的對象。如果試圖刪除關聯的對象,將引發 ProtectedError 異常。
class OtherModel(models.Model):user = models.ForeignKey(MyUser, on_delete=models.PROTECT)
如果試圖刪除與 OtherModel 關聯的 MyUser 對象,將引發 ProtectedError 異常,從而防止刪除。
4.models.SET_NULL: 將外鍵設置為 NULL(僅適用于可為 NULL 的外鍵字段)。
class OtherModel(models.Model):user = models.ForeignKey(MyUser, on_delete=models.SET_NULL, null=True)
如果刪除與 OtherModel 關聯的 MyUser 對象,OtherModel 中的 user 外鍵將被設置為 NULL。
5.models.SET_DEFAULT: 將外鍵設置為默認值。
class OtherModel(models.Model):user = models.ForeignKey(MyUser, on_delete=models.SET_DEFAULT, default=default_user_id)
如果刪除與 OtherModel 關聯的 MyUser 對象,OtherModel 中的 user 外鍵將被設置為默認值。
models.SET: 將外鍵設置為指定的值。
class OtherModel(models.Model):user = models.ForeignKey(MyUser, on_delete=models.SET(set_user_id))
如果刪除與 OtherModel 關聯的 MyUser 對象,OtherModel 中的 user 外鍵將被設置為指定的值。
models.SET_NULL 和 models.SET_DEFAULT 的注意事項: 這兩個選項只能用于可為 NULL 的外鍵字段。如果外鍵字段不可為 NULL,使用這兩個選項將會引發 ValueError。
class OtherModel(models.Model):user = models.ForeignKey(MyUser, on_delete=models.SET_NULL, null=True) # 可以使用user = models.ForeignKey(MyUser, on_delete=models.SET_DEFAULT, default=default_user_id, null=True) # 可以使用user = models.ForeignKey(MyUser, on_delete=models.SET_NULL) # 會引發 ValueErroruser = models.ForeignKey(MyUser, on_delete=models.SET_DEFAULT, default=default_user_id) # 會引發 ValueError
6.models.DO_NOTHING: 什么也不做。刪除關聯的對象后,不對外鍵進行任何操作。
class OtherModel(models.Model):user = models.ForeignKey(MyUser, on_delete=models.DO_NOTHING)
使用這個選項時,你需要確保在數據庫級別處理外鍵的完整性。這通常需要你手動管理外鍵的約束。