Image file not deleted when object with ImageField field is deleted
Asked Answered
O

2

15

I've got a model Picture with an ImageField. When deleting an instance of Picture, the file set in the ImageField is not deleted.

Is it a bug? How can I do it?

Omaomaha answered 12/7, 2012 at 16:31 Comment(2)
What does your view look like?Fils
possible duplicate of How do I get Django Admin to delete files when I remove an object from the database/model?Chortle
C
32

Deletion of files associated with FileFields and ImageFields was intentionally removed in Django 1.3. See ticket #6456. Django uses transactions extensively to prevent data corruption if something goes wrong with the request. If a deletion transaction is rolled-backed, after the file has been deleted from the filesystem, then you now have a record pointing to a non-existent file. All tickets asking for automatic deletion to return have been summarily marked "Won't Fix", so this is not going to change.

For workarounds, see this previous StackOverflow question.

Chortle answered 12/7, 2012 at 16:47 Comment(0)
F
1

The assumptions?

class Picture(models.Model):
    image = ImageField(blank=True, null=True, upload_to="pics")

    def delete(self, *args, **kwargs):
        self.image.delete()
        super(Picture, self).delete(*args, **kwargs)

Then lets manually create and delete this..

image = "./image.jpg"
picture = Picture.objects.create(image=File(open(image, "r"))
picture.save()

Then delete it?

picture.delete()

HTH

Fils answered 12/7, 2012 at 16:52 Comment(2)
Although this answer is already quite old: line 5 in the first codeblock should be self.image.delete()Afterbrain
And it better use signals as it doesn't work for Picture.objects.filter(...).delete() for example.Susiesuslik

© 2022 - 2024 — McMap. All rights reserved.