Django - обновление модели не приведет к удалению старого FileField

Я реализую приложение с 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)

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

Я был бы очень признателен за вашу помощь


person Raul San N.H.    schedule 07.01.2010    source источник


Ответы (2)


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

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

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

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

person Seth    schedule 07.01.2010
comment
Да, ты прав! Разработчики django, похоже, работают над новым дизайном для этого случая в новых выпусках. Один из вариантов - добавить дополнительную опцию в FileFields, чтобы файлы можно было заменять при загрузке: groups.google.com/group/django-developers/browse_thread/thread/ Я поддерживаю эту идею. Спасибо за вашу помощь, Сет, я могу использовать тот патч, о котором вы мне рассказывали. - person Raul San N.H.; 08.01.2010
comment
У меня возникла еще одна идея - вы можете попробовать добавить параметр show_hidden_initial в свой FileField. Предположительно, это даст вам доступ к исходному значению FileField перед загрузкой нового файла. - person Seth; 11.01.2010

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

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

person un1t    schedule 17.08.2012
comment
Похоже, отличное решение. Я больше не работаю над django и не могу его протестировать, но я благодарю вас за ваш вклад, un1t! - person Raul San N.H.; 29.08.2012