Django удалить неиспользуемые файлы мультимедиа

У меня есть проект django, в котором администраторы могут загружать носители. По мере продажи товаров они удаляются с сайта, тем самым удаляя их запись в базе данных MySQL. Однако изображения, связанные с элементом, остаются в файловой системе. Это не обязательно плохое поведение - я не против держать файлы вокруг, если удаление было несчастным случаем. Проблема I forsee через два года, когда пространство для хранения ограничено из-за папки носителя, раздутой старым продуктом изображения.

кто-нибудь знает о систематическом/программном способе сортировки всех изображений и сравнения их с соответствующими полями MySQL, удаляя любое изображение, которое не имеет соответствия из файловой системы? В идеальном мире я представляю себе кнопку в Django-admin, такую как" очистка неиспользуемых носителей", которая выполняет скрипт python, способный к такому поведению. Я поделюсь всем, что мое окончательное решение здесь, но то, что я ищу прямо сейчас, это любой, у кого есть идеи, знает ресурсы, или сделали это в какой-то момент сами.

5 ответов


попробовать Джанго-очистка, он автоматически вызывает метод delete в FileField при удалении модели.

pip install django-cleanup

settings.py

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

django-неиспользуемые-медиа поможет вам очистить старые неиспользуемые носители с помощью команды управления.

очень полезно, когда вы только начали использовать django-cleanup и уже есть файлы, которые нужно удалить. Или если у вас есть эскизы, которые необходимо удалить из медиа-каталога.


вы можете использовать сигналы. Чем использовать ОС.remove () для очистки связанных файлов при удалении.

таким образом, ваша файловая система всегда отражает вас дБ. Не нужно нажимать на кнопки.


следующее, Как я в настоящее время делаю это с Django 1.7, который нужно использовать с самого начала, я не знаю, как вы очищаете неферментированные файлы в ретроспективе.

скажем, у вас есть приложение под названием "автомобили" и модель под названием "Автомобиль".

signals.py:

# cars/signals.py

from django.conf import settings
from django.dispatch import receiver
from django.db.models.signals import post_delete

from cars.models import Car

# By adding 'Car' as 'sender' argument we only receive signals from that model
@receiver(post_delete, sender=Car)
def on_delete(sender, **kwargs):
    instance = kwargs['instance']
    # ref is the name of the field file of the Car model
    # replace with name of your file field
    instance.ref.delete(save=False)

apps.py:

# cars/apps.py
from django.apps import AppConfig

class CarConfig(AppConfig):
    name = "cars"
    def ready(self):
        import cars.signals

__init__.py:

default_app_config = 'cars.apps.CarConfig'

возможно, это немного поздно, но если вы также хотите узнать больше о проблемах, которые могут появиться при удалении, вот статья что объясняет, как удалить их двумя способами (с фрагментами кода).

существует команда управления, которую можно вызывать время от времени, и более "немедленное" решение, используя сигналы.