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'
возможно, это немного поздно, но если вы также хотите узнать больше о проблемах, которые могут появиться при удалении, вот статья что объясняет, как удалить их двумя способами (с фрагментами кода).
существует команда управления, которую можно вызывать время от времени, и более "немедленное" решение, используя сигналы.