在Django中删除上传的文件

问题描述 投票:5回答:2

我有以下代码删除文件:

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

我不是要从数据库中删除文件吗?任何帮助,将不胜感激。

django delete-file
2个回答
8
投票

您的问题是,您要覆盖模型上的delete()方法,但要对默认管理器(Documents.object.all()。delete())返回的QuerySet调用delete方法。这是2种独立的方法,因此有2种解决方法。

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

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

作者

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

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

Document.objects.all().delete()

作者

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

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

中对此进行了解释

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)
© www.soinside.com 2019 - 2024. All rights reserved.