级联删除时,覆盖删除方法不起作用

时间:2018-02-16 17:53:43

标签: django django-models

我有一个模拟xml应答器的混合和树状结构的应用程序。

我的第一个模型IdBalise用于将父母与孩子联系起来。它与不同的balise模型与GenericForeignKey链接:

class IdBalise(models.Model):
    idBalise=models.AutoField(primary_key=True)

    parent = models.ForeignKey('IdBalise', on_delete=models.CASCADE, related_name="parentbal", null=True, blank=True)

    content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE)
    object_id = models.PositiveIntegerField()
    content_object = GenericForeignKey('content_type', 'object_id')

我使用了许多类似下面的balise模型:

class BiblBalise(Balise):
    idbal = GenericRelation(IdBalise, content_type_field="content_type", object_id_field="object_id", on_delete=models.CASCADE)  
    baliseName='bibl'

为了在删除IdBalise时删除应答器内容,我覆盖了IdBalise的删除方法:

def delete(self):
        self.content_object.delete()
        super(IdBalise, self).delete()

完美无缺。当我删除I​​dBalise时,其相关内容(例如,BiblBalise中的条目)将被删除。

我的问题是,当我删除父母时,孩子的内容不会删除。由于“父”字段上的on_delete = models.CASCADE,子IDB删除被删除。但是他们的内容(例如,BiblBalise中的条目)不会被删除。

为什么删除子IDBalise后,我的覆盖删除方法不起作用?有什么想法吗?

由于

1 个答案:

答案 0 :(得分:0)

最新答案,但我正在寻找相同的问题,并注意到Django documentation说:

  

在批量操作中不会调用覆盖的模型方法

     

请注意,使用QuerySet批量删除对象或由于级联删除而导致未必调用对象的 delete()方法。为了确保执行自定义的删除逻辑,您可以使用 pre_delete 和/或 post_delete 信号。

     

不幸的是,批量创建或更新对象时没有解决方法,因为没有调用save(),pre_save和post_save。

因此基本上,您应该使用pre_delete的信号处理程序。