我有以下代码删除文件:
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()
我不是要从数据库中删除文件吗?任何帮助,将不胜感激。
您的问题是,您要覆盖模型上的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
中对此进行了解释尝试一下
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)