gpt4 book ai didi

django - 删除父模型时不会调用子模型的重写删除方法?

转载 作者:行者123 更新时间:2023-12-02 08:57:51 24 4
gpt4 key购买 nike

我有两个模型,每个模型都有一个图像。其中一个拥有父级的外键。当我删除父级时,我想删除父级和子级以及磁盘上的图像文件。为此,我重写了删除方法:

class MyModelParent(models.Model):
image = models.ImageField(upload_to = "images/" )

def delete(self, *args, **kwargs):
if self.image:
self.image.delete()
super(MyModelParent, self).delete(*args, **kwargs)

class MyModelChild(models.Model):
parent = models.ForeignKey(MyModelParent)
image = models.ImageField(upload_to = "images/" )

def delete(self, *args, **kwargs):
if self.image:
self.image.delete()
super(MyModelChild, self).delete(*args, **kwargs)

当我删除 MyModelParent 的实例时,它的重写的 delete() 会被调用,但不会调用子级的实例(即使它们已从数据库中删除),因此它们的图像仍保留在磁盘上。有人知道我做错了什么吗?

最佳答案

你没有做错任何事。问题是级联时不会调用任何子级的 delete() 方法。

来自 delete 的文档(级联删除使用数据库查询):

The delete() method does a bulk delete and does not call any delete() methods on your models. It does, however, emit the pre_delete and post_delete signals for all deleted objects (including cascaded deletions).

但是,pre_deletepost_delete 信号仍然会发送。您需要做的是连接一个回调,该回调将监听这些信号之一并执行所需的任何额外清理。有关 connecting signals 的更多信息,请参阅相关文档。 .

关于django - 删除父模型时不会调用子模型的重写删除方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8944207/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com