我有以下代码来删除文件:
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()
我没有从数据库中删除该文件吗?任何帮助将不胜感激。
答案 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)