Удаляет ли удаление объекта Django Model с полем File хранилище, используемое для файла? - PullRequest
4 голосов
/ 26 августа 2010

Удаление объекта Django Model с полем File удаляет хранилище, используемое для файла?Удаляет ли он файл на диске?

Ответы [ 2 ]

5 голосов
/ 26 августа 2010

OMG, я надеюсь, что нет! Расскажите о своей быстрой поездке в страну слез.

Если вы хотите освободить хранилище, вы должны переопределить метод модели .delete (), удалить файл, а затем super (), чтобы БД закончила очистку.

Обновление: Я был не прав ... возможно. Из анализа кода в django / db / fields / files.py (версия 1.1.1) я вижу, что при определенных обстоятельствах, в зависимости от того, какой класс объекта хранения вы используете, он может (или может нет) удалить связанное хранилище. К сожалению, когда и почему это противоречиво, и на эту неопределенность открыт 2 + летний билет . Класс default_storage удаляет связанный файл, но ненадежно (см. Вышеупомянутый тикет).

Это означает, что вы должны быть осторожны и протестировать определенный класс хранения, который вы используете до того, как у вас важные данные окажутся в неопределенном состоянии.

4 голосов
/ 14 января 2013

По состоянию на Django 1.3, нет . Из Django 1.3 CHANGELOG :

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

В последующих версиях (проверено для версии 1.5) политика разработчиков оставляла за собой право решать, когда и как удалять связанные с моделью файлы из хранилища.

Простой способ справиться с удалением файла, если он соответствует требованиям времени жизни файла, - это перехватить сигнал pre_delete и затем удалить файл . Этот метод совместим с массовым удалением, как это делает администратор Django.

...