2013-07-15 6 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() на модели, но вы вызываете метод delete в QuerySet, возвращаемом менеджером по умолчанию (Documents.object.all(). Delete()). Это два отдельных метода, поэтому есть два способа их устранения.

1.In удаления, метод модели заменить строку

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

по

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

И, вызовите метод удаления для каждого объекта отдельно. Заменить

Document.objects.all().delete() 

по

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

2.Replace менеджер по умолчанию, чтобы вернуть пользовательский QuerySet, который переопределяет метод удаления(). Это объясняется в Overriding QuerySet.delete() in Django

+0

нет У меня не получилось исключение, os.remove, похоже, не исправил ошибку. – user2569766

+0

Мы получили тот же ответ! Я исправил эту последнюю ночь, и я понял, что не должен переопределять метод удаления вообще, я просто добавил os.remove (...) после document.delete() – user2569766

Смежные вопросы