Usuń wiele obiektów w django

108

Muszę wybrać kilka obiektów do usunięcia z mojej bazy danych w django za pomocą strony internetowej. Nie ma kategorii do wyboru, więc nie mogę usunąć ich wszystkich w ten sposób. Czy muszę zaimplementować własny formularz usuwania i przetwarzać go w django, czy też django ma już sposób, aby to zrobić? Ponieważ jest zaimplementowany w interfejsie administratora.

Dziekan
źródło

Odpowiedzi:

203

Możesz usunąć dowolny zestaw QuerySet. Na przykład, aby usunąć wszystkie posty na blogu z pewnym modelem Post

Post.objects.all().delete()

oraz do usuwania wszelkich postów z przyszłą datą publikacji

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

Musisz jednak znaleźć sposób na zawężenie swojego zestawu QuerySet. Jeśli chcesz tylko, aby widok usunął określony obiekt, spójrz na ogólny widok usuwania .

EDYTOWAĆ:

Przepraszam za nieporozumienie. Myślę, że odpowiedź jest gdzieś pomiędzy. Aby zaimplementować własną rękę, połączyć ModelFormS i ogólne widoki . W przeciwnym razie zapoznaj się z aplikacjami innych firm, które zapewniają podobną funkcjonalność. W pokrewnym pytaniu zaleceniem było django-filter .

Matt Luongo
źródło
1
Nie, źle zrozumiałeś pytanie. Rozumiem, że mogę usunąć wszystko. Ale muszę zaznaczyć obiekty do usunięcia za pomocą formularza na stronie internetowej. Następnie przetwórz dane zwrócone z formularza w moim views.py. Następnie zapętlaj to, co zwrócono w formularzu, usuwając jako pętlę przez dane. Ale chciałem wiedzieć, jaka jest najlepsza praktyka implementacji tego w django.
Dziekan
Ach, mój błąd! Użyłbym aplikacji innej firmy lub ogólnych widoków z ModelForms.
Matt Luongo
7
@Dean, spójrz na ten widok usuwania. Lub możesz po prostu napisać swój własny widok ... Mam na myśli to, że ostatecznie prawdopodobnie otrzymujesz listę PK i wzywasz delete w swoim modelu ... MyModel.objects.filter(id__in=request.POST.getlist('delete_list')).delete()i jestem pewien, że chcesz czegoś, co sprawi, że przypadkowa osoba nie może usunąć wszystkich obiekty w twojej bazie danych, zgadując PK.
Yuji 'Tomita' Tomita
1
@Dean, ciężko jest odpowiedzieć na twoje pytanie, nie rozumiejąc go więcej. Musisz tylko zbudować formularz, który pozwoli użytkownikowi wybrać prawidłowe kryteria usuwania (cokolwiek to może być - być może nawet pole wprowadzania, w którym wpisuje się numer identyfikacyjny ... ale prawdopodobnie bardziej złożone), zbudować widok, który na to zareaguje form, być może przeprowadza walidację (uprawnienia), a na koniec uruchamia tę filter(foo).delete()metodę.
Yuji 'Tomita' Tomita
1
Jednym z powodów, dla których nie ma tego frameworka, jest kwestia autoryzacji edycji / usuwania i inne zawiłości wspomniane przez @YujiTomita. Jeśli naprawdę potrzebujesz złożonego filtrowania, wypróbuj filtrowanie django i dodaj przycisk usuwania, który wywołuje QuerySet.delete (), jeśli użytkownik jest autoryzowany.
Matt Luongo