在Django中删除子对象时删除父对象

在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中删除子对象时删除父对象

+0

但我认为你必须将这个“on_delete = models.CASCADE”添加到ForeignKey字段,然后你可以删除将自动删除B(模型)的A(模型)。 –

您应该使用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

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

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