我有两个模型,每个模型都有一个图像.一个人拥有父母的外键.当我删除父级时,我想删除父级和子级以及磁盘上的映像文件.为此,我重写了删除方法:
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_delete和post_delete信号.你需要做的是连接一个回调,它将监听这些信号之一并进行任何额外的清理工作.有关详细信息,请参阅相关文档connecting signals.
| 归档时间: |
|
| 查看次数: |
1486 次 |
| 最近记录: |