在Django中未调用Custom Storage delete()方法



我有一个从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)