我有一个django项目,管理员可以在其中上传媒体。当项目出售时,它们将从站点中删除,从而删除它们在MySQL数据库中的条目。但是,与项目关联的图像仍保留在文件系统上。这不是必然的坏行为 - 我不介意保留文件,以防删除是一个意外。我想到的问题是两年后,由于媒体文件夹因旧产品图像而膨胀,存储空间有限。
有没有人知道一种系统/程序化的方法来对所有图像进行排序并将它们与相关的MySQL字段进行比较,删除任何与文件系统不匹配的图像?在完美的世界中,我想象一下django-admin中的一个按钮,如“清理未使用的媒体”,它执行能够执行此行为的python脚本。我会在这里分享我最终的解决方案,但我现在正在寻找的是那些有想法,了解资源或者在某些方面自己完成这项任务的人。
答案 0 :(得分:24)
尝试django-cleanup,当您删除模型时,它会自动调用FileField上的delete方法。
pip install django-cleanup
settings.py
INSTALLED_APPS = (
...
'django_cleanup', # should go after your apps
)
答案 1 :(得分:6)
django-unused-media将帮助您通过管理命令清理旧的未使用的媒体。
当您刚开始使用django-cleanup
并且已经拥有需要删除的文件时非常有用。
或者,如果您有需要从媒体目录中删除的缩略图。
答案 2 :(得分:2)
您可以使用信号。比使用os.remove()清除删除时的相关文件。
这样您的文件系统始终反映您的数据库。无需按某个按钮。
答案 3 :(得分:2)
也许这有点晚了,但如果您还想了解删除时可能出现的问题的更多信息,here's an article解释了如何以两种方式删除它们(使用代码片段)。
有一个可以随时调用的管理命令,以及更多"立即"解决方案,使用信号。
答案 4 :(得分:1)
以下是我目前使用Django 1.7的方法,它从一开始就需要使用我不知道如何在回顾过程中清理未引用的文件。
说你有一个名为' cars'和一个名为' Car'。
的模型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'