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

Wes*_*Dec 6 django

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

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)
Run Code Online (Sandbox Code Playgroud)

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

aga*_*rs3 10

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

从文档中delete(cascaded delete使用数据库查询):

delete()方法执行批量删除,不会在模型上调用任何delete()方法.但是,它会为所有已删除的对象(包括级联删除)发出pre_delete和post_delete信号.

但是,仍然会发送pre_deletepost_delete信号.你需要做的是连接一个回调,它将监听这些信号之一并进行任何额外的清理工作.有关详细信息,请参阅相关文档connecting signals.