在Django中删除上传的文件

时间:2013-07-15 20:57:46

标签: django delete-file

我有以下代码来删除文件:

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()

我没有从数据库中删除该文件吗?任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:8)

您的问题是您正在覆盖模型上的delete()方法,但是您正在调用默认管理器返回的QuerySet上的delete方法(Documents.object.all()。delete())。这是两种不同的方法,因此有两种解决方法。

1.在模型的删除方法中替换行

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

通过

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

AND,分别为每个对象调用delete方法。替换

Document.objects.all().delete()

通过

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

2.替换默认管理器以返回自定义QuerySet,该自定义QuerySet将覆盖delete()方法。这在Overriding QuerySet.delete() in Django

中有解释

答案 1 :(得分:0)

尝试一下

document = Document.objects.get(pk=pk)
# if `save`=True, changes are saved to the db else only the file is deleted
document.docfile.delete(save=True)

答案 2 :(得分:0)

这是另一种解决方案

def delete(self, *args, **kwargs):
   os.remove(os.path.join(settings.MEDIA_ROOT, self.qr_code.name))
   super().delete(*args, **kwargs)