2014-02-21 10 views
12

Ich habe ein Django-Projekt, in dem die Admins Medien hochladen können. Wenn Artikel verkauft werden, werden sie von der Site gelöscht, wodurch ihr Eintrag in der MySQL-Datenbank entfernt wird. Die mit dem Objekt verknüpften Bilder verbleiben jedoch im Dateisystem. Dies ist nicht unbedingt schlechtes Verhalten - es macht mir nichts aus, Dateien herumzulegen, falls eine Löschung ein Unfall war. Das Problem, das ich vorhersehe, ist in zwei Jahren, wenn der Speicherplatz begrenzt ist, weil ein Medienordner aufgebläht ist mit alten Produktbildern.Django löschen nicht verwendete Mediendateien

Kennt jemand eine systematische/programmatische Methode, um ALLE Bilder zu sortieren und sie mit den relevanten MySQL-Feldern zu vergleichen und jedes Bild zu löschen, das KEINE Übereinstimmung mit dem Dateisystem hat? In der perfekten Welt stelle ich mir eine Schaltfläche im django-admin vor wie "Ungenutzte Medien bereinigen", die ein Python-Skript ausführt, das zu diesem Verhalten fähig ist. Ich werde teilen, was auch immer meine mögliche Lösung hier ist, aber was ich im Moment suche, ist jeder, der Ideen hat, Ressourcen kennt oder dies irgendwann selbst getan hat.

Antwort

16

django-cleanup Versuchen, es ruft automatisch Methode löschen auf Filefield, wenn Sie entfernen Modell.

pip install django-cleanup 

settings.py

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

Wirklich gut. Danke – brunofitas

+0

Manchmal möchte ich meine Website im Internet hosten. Ich gehe davon aus, dass der Computer des Hosting-Service-Providers alles hat, was nötig ist, damit meine Website wunderbar im Internet funktioniert. Aber wie kann ich sicher sein, dass sie 'django_cleanup' haben oder nicht? und wenn sie nicht tun, was soll ich tun? –

2

Sie können Signale verwenden. Verwenden Sie dann os.remove(), um verwandte Dateien beim Löschen zu bereinigen.

Auf diese Weise spiegelt Ihr Dateisystem immer db wider. Keine Notwendigkeit, einen Knopf zu schlagen.

+0

Es gibt andere Probleme durch Überschreiben der Methode löschen. Wenn ich ein ForeignKey auf einem anderen Modell habe, dass es ein Bildfeld hat und ON_CASCADE DELETE ... das Bild löscht sich nicht. Ein weiteres Problem ist die Ersetzung von Dateien. Wenn ich ein ImageField aktualisiere, bleiben die alten Dateien in meinem Media-Ordner .... Was ist der richtige Weg von sauberen Medienordner aus unbenutzten Dateien? –

+2

Verwenden Sie nicht die Löschmethode. Hast du das gesehen: http://stackoverflow.com/questions/4394194/replacing-a-django-image-doesnt-delete-original#answer-8342249 und https://github.com/un1t/django-cleanup – allcaps

1

Das Folgende ist, wie ich es derzeit mit Django 1.7 mache, die von Anfang an verwendet werden müssen Ich weiß nicht, wie Sie im Nachhinein referenzierte Dateien aufräumen.

Angenommen, Sie haben eine App namens "Autos" und ein Modell namens "Auto".

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 wird Ihnen helfen, alte nicht verwendete Medien vom Management Befehl zu reinigen.

Sehr nützlich, wenn Sie gerade angefangen haben, django-cleanup zu verwenden und bereits Dateien haben, die gelöscht werden müssen. Oder wenn Sie Thumbnails haben, die aus dem Medienverzeichnis gelöscht werden müssen.

0

Vielleicht ist dies ein bisschen spät, aber wenn Sie auch mehr über die Probleme wissen wollen, die mit dem Löschen auftreten können, erklärt here's an article, wie Sie sie auf zwei Arten (mit Code-Schnipsel) löschen.

Es gibt einen Verwaltungsbefehl, der hin und wieder aufgerufen werden kann, und eine "sofortige" Lösung, die Signale verwendet.

Verwandte Themen