【问题标题】:Custom Storage delete() method is not called in DjangoDjango 中不调用自定义存储 delete() 方法
【发布时间】:2012-01-16 23:37:10
【问题描述】:

我有一个从 ImageField 继承的字段,具有这样的自定义存储:

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

当删除带有该字段的对象时(使用 object.delete(),而不是 bulk),自定义存储的 delete 方法不会被调用。尝试调试时,我找不到 Django 在哪里通过对象的字段来删除文件或实际存储中的任何内容。或者我应该手动/在挂钩中删除文件/将自定义 delete() 方法写入我的最终模型,该方法将在实际对象上调用后台 delete()?我找不到标准 ImageFile + 默认文件系统如何处理这个问题,但会假设常规文件会被删除。还是我弄错了?

感谢您提供任何见解。

伊戈尔

【问题讨论】:

    标签: python django storage


    【解决方案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)
    

    【讨论】:

    • 谢谢,这就是我所缺少的。
    • @IgorR 很高兴这就是您正在寻找的内容,因此请您将其标记为已接受的答案吗?
    猜你喜欢
    • 2015-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-11
    • 2018-02-09
    • 1970-01-01
    • 2018-01-05
    • 1970-01-01
    相关资源
    最近更新 更多