2017-10-09 132 views
1
class A(models.Model): 
    name = models.CharField(max_length=128) 

class B(modes.Model): 
    type_b = models.ForeignKey(A) 

如何在刪除模型'B'的相關子對象時刪除模型'A'的父對象。我通過Django刪除子對象admin批量刪除選項在Django中刪除子對象時刪除父對象

+0

但我認爲你必須將這個「on_delete = models.CASCADE」添加到ForeignKey字段,然後你可以刪除將自動刪除B(模型)的A(模型)。 –

回答

1

您應該使用signals

@receiver(post_delete, sender=B) 
def delete_a(sender, instance, **kwargs): 
    # instance.type_b is the object which you want to delete 
+0

當我嘗試刪除使用'instance.type_b.delete()'我得到''NoneType'對象沒有屬性'delete''錯誤 –

+0

@alternativeony這樣做A.objects.filter(pk = instance.type_b .pk).delete() –

+0

如果用戶僅對子模型有權限而對父模型沒有權限會怎麼樣? 'post_delete'信號是否會刪除兩個? @DavitTovmasyan – filtfilt

0

做它最好的方法,只需添加[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) 
+0

我嘗試過'models.CASCADE',但它沒有按預期工作。 –

+0

正如Davit Tovmasyan所說,嘗試使用SIGNAL post_delete – Lemayzeur

0

您可以使用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)