【问题标题】:Overwrited delete method doesn't work when cascading delete级联删除时覆盖的删除方法不起作用
【发布时间】:2018-07-27 16:38:45
【问题描述】:

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

我的第一个模型 IdBalise 用于将父母与孩子联系起来。它通过 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')

我使用了许多应答器模型,如下所示:

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

为了在我删除一个IdBalise时删除应答器的内容,我重写了IdBalise的delete方法:

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

完美运行。当我删除 IdBalise 时,它​​的相关内容(例如 BiblBalise 中的条目)会被删除。

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

为什么当孩子 IdBalise 被删除时我的覆盖删除方法不起作用?有什么想法吗?

谢谢

【问题讨论】:

    标签: django django-models


    【解决方案1】:

    迟到的答案,但我正在查看同样的问题,并注意到 Django documentation 说:

    在批量操作中不调用重写的模型方法

    请注意,当使用 QuerySet 批量删除对象或作为级联删除的结果时,不一定要调用对象的 delete() 方法。为确保执行自定义删除逻辑,您可以使用 pre_delete 和/或 post_delete 信号。

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

    所以基本上你应该在你的情况下使用为pre_delete 编写一个信号处理程序。

    【讨论】:

      猜你喜欢
      • 2013-06-22
      • 2013-03-03
      • 1970-01-01
      • 1970-01-01
      • 2012-11-18
      • 2011-06-11
      • 2018-06-04
      相关资源
      最近更新 更多