Wie lösche ich einen Datensatz in Django-Modellen?


267

Ich möchte einen bestimmten Datensatz löschen. Sowie

delete from table_name where id = 1;

Wie kann ich das in einem machen django model?


16
Danke, dass Sie die Frage gestellt haben. Manchmal dauert RTFM viel länger als eine Google-Suche und SO, wie die Anzahl der Antwortstimmen und die Anzahl der Aufrufe zeigt
Freedom_Ben

8
Einverstanden mit @Freedom_Ben, aber für zukünftige Leser, die das f * -Handbuch trotzdem mögen, ist dies das, wonach Sie suchen: docs.djangoproject.com/de/dev/topics/db/queries/…
Dinei

Antworten:


512

Es gibt verschiedene Möglichkeiten:

So löschen Sie es direkt:

SomeModel.objects.filter(id=id).delete()

So löschen Sie es aus einer Instanz:

instance = SomeModel.objects.get(id=id)
instance.delete()

50
Beachten Sie, dass der erste die .delete () -Methode des Objekts nicht aufruft. Wenn Sie also in dieser Methode 'Bereinigungscode' haben, wird dieser nicht aufgerufen. Im Allgemeinen kein Problem, aber es lohnt sich, daran zu denken.
Matthew Schinckel

8
@ Matthew Schinckel: das stimmt. Wenn Sie eine benutzerdefinierte Löschmethode haben möchten, sollten Sie stattdessen das Signal pre_deleteoder post_deleteverwenden.
Wolph

2
Ich weiß nicht, was nach DJango 1.4 der Fall ist, aber dies ruft tatsächlich alle PKs ab und löscht sie dann durch diese PKs. Wenn Sie also beispielsweise durch ein beliebiges Feld löschen, kann dies viel langsamer sein als das SQL-Gegenstück ... :(
Vajk Hermecz

1
@VajkHermecz: das ist wahr und das erwartete Verhalten aufgrund der Löschsignale. Das Django-Signalsystem muss alle Datenbankänderungen verfolgen, da sich etwas daran anschließen könnte (wie dies bei der Umkehrung der Fall ist).
Wolph

3
Mit dem Rückgabewert von delete()können Sie überprüfen, was Sie gelöscht haben. Es gibt ein Tupel mit der Anzahl der gelöschten Objekte und ein Wörterbuch mit Details zu den gelöschten Typen zurück, z (1, {'yourapp.SomeModel': 1}).
mcb

37
MyModel.objects.get(pk=1).delete()

Dies löst eine Ausnahme aus, wenn das Objekt mit dem angegebenen Primärschlüssel nicht vorhanden ist, da zunächst versucht wird, das angegebene Objekt abzurufen.

MyModel.objects.filter(pk=1).delete()

Dies löst keine Ausnahme aus, wenn das Objekt mit dem angegebenen Primärschlüssel nicht vorhanden ist und die Abfrage direkt erzeugt wird

DELETE FROM my_models where id=1

1
Tippfehler in MyModel.object.filter(pk=1).delete(). Es sollten "Objekte" sein.
Nigel

7

Wenn Sie einen Eintrag löschen möchten

wishlist = Wishlist.objects.get(id = 20)
wishlist.delete()

Wenn Sie beispielsweise alle Elemente in der Wunschliste löschen möchten

Wishlist.objects.all().delete()

7

Wenn Sie eine Instanz löschen möchten, schreiben Sie den Code

delet= Account.objects.get(id= 5)
delet.delete()

Wenn Sie alle Instanzen löschen möchten, schreiben Sie den Code

delet= Account.objects.all()
delete.delete()

6

Wolph lieferte eine gute Antwort fokussierte Codes. Lassen Sie mich hier nur das offizielle Dokument einfügen , um die Leute darauf zu verweisen.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.