Jak usunąć rekord w modelach Django?


267

Chcę usunąć konkretny rekord. Jak na przykład

delete from table_name where id = 1;

Jak mogę to zrobić django model?


16
Dziękuję za pytanie. Czasami RTFM zajmuje dużo więcej czasu niż wyszukiwanie w Google i SO, o czym świadczy liczba głosów w odpowiedzi i liczba wyświetleń
Freedom_Ben

8
Uzgodniony z @Freedom_Ben, ale dla przyszłych czytelników, którzy mimo wszystko lubią instrukcję f *, właśnie tego szukasz: docs.djangoproject.com/en/dev/topics/db/queries/…
Dinei

Odpowiedzi:


512

Istnieje kilka sposobów:

Aby usunąć bezpośrednio:

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

Aby usunąć go z instancji:

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

50
Zauważ, że pierwszy nie wywoła metody .delete () obiektu, więc jeśli masz kod „cleanup” w tej metodzie, nie zostanie on wywołany. Zasadniczo nie jest to problem, ale warto o tym pamiętać.
Matthew Schinckel

8
@Matthew Schinckel: to prawda. Jeśli chcesz mieć niestandardową metodę usuwania, zamiast tego powinieneś użyć sygnału pre_deletelub post_delete.
Wolph,

2
Nie wiem, co się dzieje po DJango 1.4, ale tak naprawdę pobiera wszystkie PK, a następnie usuwa je. Na przykład, jeśli usuniesz dowolne pole, może to być o wiele wolniejsze niż odpowiednik SQL ... :(
Vajk Hermecz

1
@VajkHermecz: to prawda i oczekiwane zachowanie z powodu sygnałów usuwania. System sygnałów Django musi śledzić wszystkie zmiany w bazie danych, ponieważ coś może się do niego przyczepić (podobnie jak odwrócenie).
Wolph

3
Możesz użyć wartości zwracanej z delete() aby sprawdzić, co usuwasz. Zwraca krotkę z liczbą usuniętych obiektów i słownik ze szczegółowymi informacjami o usuniętych typach, np (1, {'yourapp.SomeModel': 1}).
mcb

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

spowoduje to wyjątek, jeśli obiekt o określonym kluczu podstawowym nie istnieje, ponieważ najpierw próbuje pobrać określony obiekt.

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

nie spowoduje to wyjątku, jeśli obiekt o określonym kluczu podstawowym nie istnieje i bezpośrednio wygeneruje zapytanie

DELETE FROM my_models where id=1

1
Literówka w MyModel.object.filter(pk=1).delete(). Powinny to być „obiekty”.
Nigel,

7

Jeśli chcesz usunąć jeden element

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

Jeśli chcesz na przykład usunąć wszystkie elementy z listy życzeń

Wishlist.objects.all().delete()

7

jeśli chcesz usunąć jedno wystąpienie, napisz kod

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

jeśli chcesz usunąć wszystkie wystąpienia, napisz kod

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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.