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?

użytkownik426795
źródło
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()
Wolph
źródło
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
Milad Khodabandehloo
źródło
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()
Ahmed Adewale
źródło
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()
piękny islam
źródło
6

Wolph dostarczył kody skupione na dobrej odpowiedzi. Pozwól, że wkleję tutaj oficjalny dokument w celach informacyjnych.

VicX
źródło