在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(模型)。 –