Django 1.3 удалить экземпляр модели и удалить файл - PullRequest
2 голосов
/ 19 декабря 2011

Я пытаюсь переопределить метод удаления модели Django, подобный этому

class Picture(models.Model):

    image = models.ImageField(upload_to='photos/')
    gallery = models.ForeignKey(Gallery)

    def __unicode__(self):
        return u'%s' % (self.image)

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

, но почему ничего не происходит?Файл изображения всегда находится в папке с фотографиями.Я использую Django 1,3

Ответы [ 3 ]

2 голосов
/ 19 декабря 2011

Django больше не удаляет файлы из версии 1.3

В более ранних версиях Django, когда был удален экземпляр модели, содержащий FileField, FileField взял на себятакже удалите файл из внутреннего хранилища.Это открыло двери для нескольких сценариев потери данных, включая откат транзакций и поля в разных моделях, ссылающихся на один и тот же файл.В Django 1.3 при удалении модели метод FileField delete () вызываться не будет.Если вам нужна очистка потерянных файлов, вам придется обрабатывать их самостоятельно (например, с помощью настраиваемой команды управления, которую можно запускать вручную или запускать по расписанию, например, через cron).

1 голос
/ 12 сентября 2012

Есть простое решение - django-cleanup

pip install django-cleanup

settings.py

INSTALLED_APPS = (
     ...
    'django_cleanup', # should go after your apps
)
1 голос
/ 19 декабря 2011

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

Обратите внимание, что обработчики post_delete запускаются только в Model.delete (), но не в QuerSet.delete ().Это было исправлено в текущей версии Django для разработчиков, поэтому, если вы регулярно используете QuerySet.delete (), я бы порекомендовал использовать версию dev.

...