【问题标题】:django 1.3 delete model instance and delete filedjango 1.3 删除模型实例并删除文件
【发布时间】:2011-12-19 07:53:12
【问题描述】:

我正在尝试像这样覆盖 Django 模型的删除方法

class Picture(models.Model):

    image = models.ImageField(upload_to='photos/')
    gallery = models.ForeignKey(Gallery)

    def __unicode__(self):
        return u'%s' % (self.image)

    def delete(self, *args, **kwargs):
        self.image.delete()
        super(Picture, self).delete(*args, **kwargs)

但是什么也没发生,为什么?图片文件始终在照片文件夹中。我正在使用 django 1.3

【问题讨论】:

    标签: django file model instance delete-file


    【解决方案1】:

    Django 不再从 version 1.3 删除文件

    在早期的 Django 版本中,当模型实例包含 FileField 被删除,FileField 自己也删除了 来自后端存储的文件。这为几个人打开了大门 数据丢失场景,包括回滚事务和字段 不同的模型引用同一个文件。在 Django 1.3 中,当 模型被删除 FileField 的 delete() 方法将不会被调用。如果 您需要清理孤立文件,您需要自己处理 (例如,使用可以运行的自定义管理命令 手动或计划通过例如定期运行cron)。

    【讨论】:

      【解决方案2】:

      您可以使用 cronjob 或手动命令来删除孤立文件。或者,您可以使用 post_delete 处理程序来删除文件。这样做的好处是,只有在删除模型实例的事务成功时才执行代码。

      但是请注意,post_delete 处理程序仅在 Model.delete() 上运行,而不在 QuerSet.delete() 上运行。这在当前的 Django 开发版中已修复,因此如果您经常使用 QuerySet.delete(),我建议您使用开发版。

      【讨论】:

        【解决方案3】:

        有一个简单的解决方案 - django-cleanup

        pip install django-cleanup
        

        settings.py

        INSTALLED_APPS = (
             ...
            'django_cleanup.apps.CleanupConfig',
        )
        

        【讨论】:

          猜你喜欢
          • 2013-01-07
          • 1970-01-01
          • 2016-12-13
          • 1970-01-01
          • 1970-01-01
          • 2016-03-18
          • 1970-01-01
          • 1970-01-01
          • 2016-12-12
          相关资源
          最近更新 更多