2013-07-15 79 views
2

我有下面的代碼刪除文件:刪除上傳的文件在Django

from django.db import models 
from django import forms 
import os 

class Document(models.Model): 
    docfile = models.FileField(upload_to='documents/%Y/%m/%d') 
    def __unicode__(self): 
     return '%s' % (self.docfile.name) 
    def delete(self, *args, **kwargs): 
     os.rmdir(os.path.join(settings.MEDIA_ROOT, self.docfile.name)) 
     super(Document,self).delete(*args,**kwargs) 

它設法刪除我要求它在我的views.py的對象,但是當我重新上傳了同名的文件似乎原始文件仍然存在,因爲我會得到「output_1.txt」而不是「output.txt」。

這是我使用刪除代碼:

def delete_matrix(): 
    documents = Document.objects.all() 
    documents.delete() 

我這不是從數據庫中刪除該文件?任何幫助,將不勝感激。

回答

4

您的問題是您重寫了模型上的delete()方法,但您調用了由默認管理器(Documents.object.all()。delete())返回的QuerySet上的delete方法。這些是2個獨立的方法,所以有2種方法來解決這個問題。

1.In模型的刪除方法替換行

os.rmdir(os.path.join(settings.MEDIA_ROOT, self.docfile.name)) 

通過

os.remove(os.path.join(settings.MEDIA_ROOT, self.docfile.name)) 

AND,調用刪除方法對於每個單獨對象。更換

Document.objects.all().delete() 

通過

documents = Document.objects.all() 
for document in documents: 
    document.delete() 

2.Replace默認管理器返回的自定義查詢集將覆蓋delete()方法。這在Overriding QuerySet.delete() in Django

+0

解釋不,我沒有得到一個異常,os.remove似乎也沒有解決錯誤。 – user2569766

+0

我們結束了相同的答案!我昨天晚上解決了這個問題,我意識到我不應該重寫刪除方法,我只是在document.delete()之後添加了os.remove(...) – user2569766