在Django中不调用自定义存储delete()方法

时间:2012-01-16 23:37:10

标签: python django storage

我有一个从ImageField继承的字段,其中包含一个自定义存储:

image = PicasaImageField(upload_to=get_upload_to, blank=True, storage=pwcs())

使用此字段删除对象时(使用object.delete(),NOT bulk),不会调用自定义存储的delete方法。试图调试,我找不到Django通过对象的字段来删除文件或实际存储中的任何内容。或者我应该手动/在钩子中删除文件/将自定义delete()方法写入我的结束模型,该模型将在实际对象上调用后台的delete()?我没有找到如何使用标准的ImageFile +默认文件系统处理它,但会假设常规文件将被删除。或者我弄错了?

感谢您的任何见解。

伊戈尔

1 个答案:

答案 0 :(得分:1)

来自Django 1.3 release notes

  

删除模型时,不会调用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)