class A(models.Model):
name = models.CharField(max_length=128)
class B(modes.Model):
type_b = models.ForeignKey(A)
如何在刪除模型'B'的相關子對象時刪除模型'A'的父對象。我通過Django刪除子對象admin批量刪除選項在Django中刪除子對象時刪除父對象
class A(models.Model):
name = models.CharField(max_length=128)
class B(modes.Model):
type_b = models.ForeignKey(A)
如何在刪除模型'B'的相關子對象時刪除模型'A'的父對象。我通過Django刪除子對象admin批量刪除選項在Django中刪除子對象時刪除父對象
您應該使用signals。
@receiver(post_delete, sender=B)
def delete_a(sender, instance, **kwargs):
# instance.type_b is the object which you want to delete
當我嘗試刪除使用'instance.type_b.delete()'我得到''NoneType'對象沒有屬性'delete''錯誤 –
@alternativeony這樣做A.objects.filter(pk = instance.type_b .pk).delete() –
如果用戶僅對子模型有權限而對父模型沒有權限會怎麼樣? 'post_delete'信號是否會刪除兩個? @DavitTovmasyan – filtfilt
做它最好的方法,只需添加[on_delete=models.CASCADE][1]
:
class A(models.Model):
name = models.CharField(max_length=128)
class B(modes.Model):
type_b = models.ForeignKey(A,on_delete=models.CASCADE)
我嘗試過'models.CASCADE',但它沒有按預期工作。 –
正如Davit Tovmasyan所說,嘗試使用SIGNAL post_delete – Lemayzeur
您可以使用post_delete信號刪除父通過吊艇架Tovmasyan的建議。
但由於作爲父對象被刪除的級聯性質,它也將刪除所有連接的B對象,這些對象將在B模型上發出post_delete
信號。因此,在post_delete
的第二個發射中,信號處理程序嘗試刪除導致'NoneType' object has no attribute 'delete'
的已刪除項目。您可以使用異常處理程序或只使用if條件來處理此問題。
def delete_parent(sender, instance, **kwargs):
if instance.type_b:
instance.type_b.delete()
post_delete.connect(delete_parent, sender=B)
但我認爲你必須將這個「on_delete = models.CASCADE」添加到ForeignKey字段,然後你可以刪除將自動刪除B(模型)的A(模型)。 –