Deleting uploaded files in Django

I have the following code to delete a 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)

It manages to delete the objects I ask it to in my views.py but when I reupload a file of the same name it seems as though the original file still exists since I'll get "output_1.txt" instead of "output.txt".

This is the code I use to delete:

def delete_matrix(): documents = Document.objects.all() documents.delete()

Am I not deleting the file from the database? Any help would be appreciated.

4 Answers

Your problem is that you are overriding the delete() method on the model but you are calling the delete method on the QuerySet returned by the default manager (Documents.object.all().delete()). These are 2 separate methods so there are 2 ways of fixing this.

1.In the delete method of the model, replace the line

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

by

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

AND, call the delete method for each object separately. Replace

Document.objects.all().delete()

with

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

2.Replace the default manager to return a custom QuerySet which overrides the delete() method. This is explained in Overriding QuerySet.delete() in Django

2

Try this

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)

here is another solution

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

You can use a much simpler code:

def delete(self, *args, **kwargs): if self.docfile: self.docfile.delete() super().delete(*args, **kwargs)

Your Answer

Sign up or log in

Sign up using Google Sign up using Facebook Sign up using Email and Password

Post as a guest

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

You Might Also Like