2011-12-19 117 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 
)