Django - обновление модели не удалит старый FileField - PullRequest
6 голосов
/ 08 января 2010

Я реализую приложение с django, у которого есть модель с FileField:

class Slideshow(models.Model):
    name = models.CharField(max_length=30,unique=True)
    thumbnail = models.FileField(max_length=1000,upload_to="images/app/slideshows/thumbnails")

и у меня есть административный бэкэнд, где django управляет моделями. Я только что добавил файл admin.py и django управляет всем для меня

from django.contrib import admin

from apps.gallery.models import Slideshow

admin.site.register(Slideshow)

В бэкэнде можно добавлять, удалять и обновлять слайд-шоу. Однако, когда я пытаюсь обновить слайд-шоу и изменить его атрибут thumbnail [FileField], django не удаляет старый файл. Следовательно, после нескольких обновлений сервер заполняется множеством файлов, которые бесполезны. Мой вопрос: как я могу заставить django автоматически удалять эти файлы после обновления?

Буду очень признателен за вашу помощь

Ответы [ 2 ]

2 голосов
/ 17 августа 2012

Я много думал об этой проблеме, и в конце концов я нашел решение, которое хорошо работает для меня. Вы можете найти все модели в проекте и подключить к ним сигналы pre_save и post_delete.

В конце я сделал приложение, которое решает эту проблему - django-cleanup

1 голос
/ 08 января 2010

Я уверен, что Django делает это специально. Например, он не может знать, могут ли какие-либо другие модели использовать этот файл. Вы также были бы очень удивлены, если бы ожидали, что файл останется, и обнаружили, что django удалил его!

Однако существует также проблема, заключающаяся в том, что как только вы меняете поле файла, вы теряете старое имя файла.

Есть открытый запрос по этой проблеме: http://code.djangoproject.com/ticket/11663

В http://code.djangoproject.com/ticket/2983 есть патч, который показывает, как переопределить __set__ для сохранения предыдущего имени файла. Тогда метод __save__ вашей модели может получить доступ к предыдущему имени файла, чтобы удалить его.

...