我有一个从ImageField继承的字段,它有一个自定义存储,如下所示:
image = PicasaImageField(upload_to=get_upload_to, blank=True, storage=pwcs())
删除带有此字段的对象时(使用object.delete(),NOT bulk),不会调用自定义存储的delete方法。在尝试调试时,我找不到Django通过对象的字段来删除文件或实际存储中的任何内容。或者我应该手动/在钩子中删除文件/在我的最终模型中写入一个自定义的delete()方法,该方法将在实际对象上调用后台delete()?我没有找到如何使用标准ImageFile+默认文件系统来处理这一问题,但我认为常规文件会被删除。还是我弄错了?
感谢您的真知灼见。
Igor
来自Django 1.3发行说明:
删除模型时,不会调用FileField的delete()方法。如果你需要清理孤立文件,你需要自己处理
正如你所建议的,你可以用一种自定义的删除方法来处理这个问题:
def delete(self, *args, **kwargs):
image.delete(save=False)
super(Foo, self).delete(*args, **kwargs)
或者使用一个接收器函数,即使没有调用object.delete()也会调用该函数:
@receiver(post_delete, sender=Foo, weak=False)
def delete_image_on_file(sender, instance, **kwargs):
image.delete(save=False)