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