2011-12-19 1 views
2

Я пытаюсь переопределить метод удаления модели крупного Джанго, как этогоДжанго 1.3 удаления экземпляра модели и удалить файл

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

ответ

2

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

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

1

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

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

1

Существует простое решение - django-cleanup

pip install django-cleanup 

settings.py

INSTALLED_APPS = (
    ... 
    'django_cleanup', # should go after your apps 
) 

 Смежные вопросы

  • Нет связанных вопросов^_^