2011-12-19 69 views
2

我试图重写一个Django模型的删除方法是这样的Django 1.3删除模型实例,并删除文件

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

回答

2

Django不删除任何文件,从多个version 1.3

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

1

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

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

1

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

pip install django-cleanup 

settings.py

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