django 1.3删除模型实例和删除文件

时间:2011-12-19 07:53:12

标签: django file model instance delete-file

我正在尝试覆盖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

3 个答案:

答案 0 :(得分:2)

Django不再从version 1.3

删除文件
  

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

答案 1 :(得分:1)

您可以使用cronjob或手动命令删除孤立文件。或者,您可以使用post_delete处理程序删除该文件。这将具有以下优点:只有在删除模型实例的事务成功时才执行代码。

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

答案 2 :(得分:1)

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

pip install django-cleanup

settings.py

INSTALLED_APPS = (
     ...
    'django_cleanup', # should go after your apps
)