Wprowadzenie.
W poprzednich wpisać poznaliśmy między innymi, jak odczytywać dane oraz jak tworzyć nowe rekordy w bazie danych. Kolejną funkcjonalnością, którą należy znać i przedstawię w tym wpisie, jest usuwanie rekordów z bazy danych poprzez API oraz przy okazji odczytywanie pojedynczego rekordu poprzed jego ID.
Spis treści serii
- Django REST API cz. 1– Tworzenie nowego projektu
- Django REST API cz. 2 – ListAPIView
- Django REST API cz. 3 – Wbudowana strona logowania
- Django REST API cz. 4 – Widoki generyczne
- Django REST API cz. 5 – ListCreateAPIView i konfiguracja dostępu
- Django REST API cz. 6 – Uszczegóławianie odpowiedzi
- Django REST API cz. 7 – Określenie z góry wartości danych
- Django REST API cz. 8 – RetrieveDestroyAPIView ⇐
- Django REST API cz. 9 – RetrieveUpdateAPIView
- Django REST API cz. 10 – Nadpisywanie zachowań metod przed/po operacji zapisu/usuwania
- Django REST API cz. 11 – Rejestracja nowego użytkownika poprzez API
- Django REST API cz. 12 – Uwierzytelnianie przy pomocy Tokena
- Django REST API cz. 13 – Generowanie tokena dla istniejących użytkowników
Zakres artykułu.
- Usuwanie rekordów z bazy danych – RetrieveDestroyAPIView
Usuwanie rekordów z bazy danych - RetrieveDestroyAPIView
Wyobraźmy sobie taką sytuacją, że popełniliśmy błąd i wypożyczyliśmy nie tę książkę, którą chcieliśmy, lecz już wykonaliśmy metodę POST. W takim przypadku powinniśmy mieć możliwość usunięcia takiego wypożyczenia. Z pomocą przyjdzie nam kolejna z klas generycznych, którą może być na przykład RetrieveDestroyAPIView.
W pierwszym kroku przejdźmy do pliku z widokami views.py i stwórzmy klasę nowego widoku class BorrowRetrieveDestroy(generics.RetrieveDestroyAPIView).
class BorrowRetrieveDestroy(generics.RetrieveDestroyAPIView): queryset = Borrow.objects.all() serializer_class = BorrowSerializer permission_classes = [IsAuthenticatedOrReadOnly]
Następnie stwórzmy ścieżkę do nowo utworzonego widoku path(‘api/borrows/<int:pk>’, views.BorrowRetrieveDestroy.as_view()). W ścieżce wprowadzamy możliwość wpisania zmiennej typu int, która będzie wskazywała na Primary Key (pk) wypożyczenia.
urlpatterns = [ path('admin/', admin.site.urls), # API path('api/authors', views.AuthorList.as_view()), path('api/books', views.BookList.as_view()), path('api/borrows', views.BorrowList.as_view()), path('api/borrows/<int:pk>', views.BorrowRetrieveDestroy.as_view()), # new # DRF path('api-auth/', include('rest_framework.urls')), ]
W tej chwili jesteśmy już w stanie przetestować naszą nową funkcjonalność. W przeglądarce wpiszmy na przykład następujący adres http://127.0.0.1:8000/api/borrows/5, z tym że dla tego przykładu wypożyczenie o id 5 musi istnieć. W związku z tym albo dodajmy nowe rekordy, albo zmieńmy id na takie, które istnieje w naszej bazie danych. Rekordy, jakie znajdują się z bazie danych sprawdzimy pod adresem http://127.0.0.1:8000/api/borrows.
Wynik dla adresu http://127.0.0.1:8000/api/borrows, zwróci nam wszystkie dostępne rekordy w bazie danych.
Wynik dla adresu http://127.0.0.1:8000/api/borrows/5, zwróci nam rekord o id 5.
Jak możemy zobaczyć, w miejscu dozwolonych metod pojawiła nam się metoda DELETE oraz pojawił się dodatkowy czerwony przycisk DELETE.
Po wciśnięciu przycisku DELETE strona zapyta nas jeszcze o potwierdzenie naszego działania. Po potwierdzeniu otrzymamy następujący efekt.
W celu sprawdzenia, czy usunięcie przebiegło pomyślnie, przejdźmy jeszcze na stronę http://127.0.0.1:8000/api/borrows.
Jak możemy zobaczyć, usunięcie przebiegło pomyślnie. Obecnie występuje jeszcze jeden problem, a mianowicie każdy użytkownik ma możliwość usuwania rekordów innych użytkowników, co warto byłoby ograniczyć.
Przejdźmy zatem do pliku z widokami views.py i dokonajmy modyfikacji nowo utworzonego widoku w następujący sposób.
from rest_framework.exceptions import ValidationError class BorrowRetrieveDestroy(generics.RetrieveDestroyAPIView): queryset = Borrow.objects.all() serializer_class = BorrowSerializer permission_classes = [IsAuthenticatedOrReadOnly] def delete(self, request, *args, **kwargs): borrow = Borrow.objects.filter(pk=kwargs['pk'], user_id=self.request.user) if borrow.exists(): return self.destroy(request, *args, **kwargs) else: raise ValidationError('You are not the owner')
Przetestujmy, czy możemy usunąć wypożyczenie innego użytkownika.
Jak możemy zobaczyć w momencie potwierdzenia, otrzymaliśmy komunikat, że nie jesteśmy właścicielami tego rekordu.
Przejdźmy jeszcze na stronę http://127.0.0.1:8000/api/borrows, żeby upewnić się, że dane nie zostały usunięte.
Jeżeli chcecie zapoznać się ze szczegółowymi informacjami o klasie RetrieveDestroyAPIView, możecie to uczynić, przechodząc pod ten link.
Spis treści serii
- Django REST API cz. 1– Tworzenie nowego projektu
- Django REST API cz. 2 – ListAPIView
- Django REST API cz. 3 – Wbudowana strona logowania
- Django REST API cz. 4 – Widoki generyczne
- Django REST API cz. 5 – ListCreateAPIView i konfiguracja dostępu
- Django REST API cz. 6 – Uszczegóławianie odpowiedzi
- Django REST API cz. 7 – Określenie z góry wartości danych
- Django REST API cz. 8 – RetrieveDestroyAPIView ⇐
- Django REST API cz. 9 – RetrieveUpdateAPIView
- Django REST API cz. 10 – Nadpisywanie zachowań metod przed/po operacji zapisu/usuwania
- Django REST API cz. 11 – Rejestracja nowego użytkownika poprzez API
- Django REST API cz. 12 – Uwierzytelnianie przy pomocy Tokena
- Django REST API cz. 13 – Generowanie tokena dla istniejących użytkowników