Löschen Sie mehrere Objekte in Django

103

Ich muss mehrere Objekte auswählen, die in Django über eine Webseite aus meiner Datenbank gelöscht werden sollen. Es gibt keine Kategorie zur Auswahl, daher kann ich nicht alle so löschen. Muss ich mein eigenes Löschformular implementieren und in Django verarbeiten oder hat Django eine Möglichkeit, dies bereits zu tun? Wie in der Admin-Oberfläche implementiert.

Dean
quelle

Antworten:

198

Sie können jedes gewünschte QuerySet löschen. Zum Beispiel, um alle Blog-Beiträge mit einem Post-Modell zu löschen

Post.objects.all().delete()

und um Beiträge mit einem zukünftigen Veröffentlichungsdatum zu löschen

Post.objects.filter(pub_date__gt=datetime.now()).delete()

Sie müssen jedoch einen Weg finden, um Ihr QuerySet einzugrenzen. Wenn Sie nur möchten, dass eine Ansicht ein bestimmtes Objekt löscht, sehen Sie sich die generische Ansicht zum Löschen an .

BEARBEITEN:

Entschuldigung für das Missverständnis. Ich denke, die Antwort liegt irgendwo dazwischen. Kombinieren Sie ModelForms und generische Ansichten , um Ihre eigenen zu implementieren . Schauen Sie sich andernfalls Apps von Drittanbietern an, die ähnliche Funktionen bieten. In einer verwandten Frage lautete die Empfehlung Django-Filter .

Matt Luongo
quelle
1
Nein, Sie haben die Frage falsch verstanden. Ich verstehe, dass ich alles löschen kann. Aber ich muss die Objekte auswählen, die mit einem Formular auf einer Webseite gelöscht werden sollen. Und dann verarbeiten Sie die vom Formular zurückgegebenen Daten in meiner views.py. Durchlaufen Sie dann das, was im Formular zurückgegeben wurde, und löschen Sie es als Schleife durch die Daten. Aber ich wollte wissen, was die beste Vorgehensweise ist, um dies in Django zu implementieren.
Dean
Ah, mein Fehler! Ich würde entweder eine Drittanbieter-App oder generische Ansichten mit ModelForms verwenden.
Matt Luongo
7
@ Dean, sehen Sie sich diese Löschansicht an. Oder Sie können einfach Ihre eigene Ansicht schreiben ... Ich meine, letztendlich erhalten Sie wahrscheinlich eine Liste von PKs und rufen bei Ihrem Modell delete auf ... MyModel.objects.filter(id__in=request.POST.getlist('delete_list')).delete()und ich bin sicher, Sie möchten etwas, um sicherzustellen, dass eine zufällige Person nicht alle löschen kann Objekte in Ihrer Datenbank durch Erraten von PKs.
Yuji 'Tomita' Tomita
1
@ Dean, es ist schwierig, deine Frage zu beantworten, ohne mehr darüber zu verstehen. Sie müssen nur ein Formular erstellen, mit dem ein Benutzer die richtigen Löschkriterien auswählen kann (was auch immer das sein mag - vielleicht sogar ein Eingabefeld, in das man eine ID-Nummer eingibt ... aber wahrscheinlich komplexer), und eine Ansicht erstellen, die darauf reagiert form, führt möglicherweise eine Validierung (Berechtigungen) durch und führt diese filter(foo).delete()Methode schließlich aus.
Yuji 'Tomita' Tomita
1
Einer der Gründe, warum dies nicht mit dem Framework verbunden ist, ist die Frage der Autorisierung für Änderungen / Löschungen und andere von @YujiTomita erwähnte Komplexitäten. Wenn Sie wirklich eine komplexe Filterung benötigen, lesen Sie die Django-Filterung und fügen Sie eine Schaltfläche zum Löschen hinzu, die QuerySet.delete () aufruft, wenn der Benutzer autorisiert ist.
Matt Luongo