Django – #32 – REST API cz. 8 – RetrieveDestroyAPIView

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.

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.

Autor artykułu
Dominik Bednarski

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany.