2014-02-21 5 views
12

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

Кто-нибудь знает о систематическом/программном способе сортировки по всем изображениям и сопоставления их с соответствующими полями MySQL, удаляя любое изображение, которое НЕ имеет соответствия из файловой системы? В идеальном мире я представляю себе кнопку в django-admin, например «Clean-up unused media», которая выполняет скрипт python, способный к такому поведению. Я буду делиться тем, что мое возможное решение здесь, но то, что я ищу сейчас, - это тот, у кого есть идеи, знания ресурсов или они сделали это в какой-то момент.

ответ

16

Попробуйте django-cleanup, он автоматически вызывает метод удаления на FileField при удалении модель.

pip install django-cleanup 

settings.py

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

Действительно хорошо. Спасибо – brunofitas

+0

Иногда, возможно, я хочу разместить свой сайт в Интернете. Я предполагаю, что компьютер провайдера хостинга имеет все необходимое, чтобы мой сайт работал красиво в Интернете. Но как я могу быть уверен, что у них есть 'django_cleanup' или нет? и если они не делают, что мне делать? –

2

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

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

+0

Есть другие проблемы путем переопределения метода удаления. Если у меня есть ForeignKey на другой модели, у нее есть поле изображения и ON_CASCADE DELETE ... этот образ не удаляет сам. Другой проблемой является замена файлов. Когда я обновляю один ImageField, старые файлы остаются в моей медиа-папке .... Каков правильный способ очистки медиа-папки от неиспользуемых файлов? –

+2

Не используйте метод удаления. Вы видели это: http://stackoverflow.com/questions/4394194/replacing-a-django-image-doesnt-delete-original#answer-8342249 и https://github.com/un1t/django-cleanup – allcaps

1

Ниже показано, как я это делаю с помощью 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' 
6

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

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

0

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

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

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