Wprowadzenie.
Często zdarza się tak, że niektóre dane powinny być zapisane z góry ustaloną wartością i na dodatek nie powinniśmy mieć możliwości podmiany takiej danej. W tym wpisie przedstawiłem, jak możemy uzyskać taką funkcjonalność.
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.
- Określenie z góry wartości danych
Określenie z góry wartości danych
Załóżmy teraz, że w naszej bibliotece każdy użytkownik będzie sam sobie wypożyczał książki. W takim przypadku, po zalogowaniu się, powinniśmy mieć możliwość wyboru jedynie książki, która nas interesuje. W związku z tym wróćmy do pliku z widokami i zmodyfikujmy klasę BorrowList(), tak aby każdy użytkownik miał możliwość wypożyczania sobie książki.
class BorrowList(generics.ListCreateAPIView): queryset = Borrow.objects.all() serializer_class = BorrowSerializer # permission_classes = [(IsAuthenticated & ReadOnly) | IsAdminUser] # new permission_classes = [IsAuthenticated] # new
Po zalogowaniu się na dowolne konto i przejściu na stronę 127.0.0.1:800/api/borrows będziemy ponownie mieli dostęp do requesta metodą POST.
Na ten moment jak możemy zobaczyć, każdy użytkownik ma możliwość wypożyczenia nie tylko sobie książki, lecz także każdej innej osobie. Zatem musimy wprowadzić kolejną modyfikację, która zablokuje taką możliwość.
Następnie w widoku w klasie BorrowList() musimy nadpisać metodę def perform_create(), która jest wywoływana przez klasę CreateModelMixin w czasie tworzenia nowej instancji obiektu. W metodzie tej, do pola user_id musimy przypisać siebie przy pomocy metody self.request.user. Więcej o tej oraz podobnych metodach możemy przeczytać na stronie pod tym linkiem.
class BorrowList(generics.ListCreateAPIView): queryset = Borrow.objects.all() serializer_class = BorrowSerializer # permission_classes = [(IsAuthenticated & ReadOnly) | IsAdminUser] permission_classes = [IsAuthenticated] def perform_create(self, serializer): # new serializer.save(user_id=self.request.user) # new
Następnie w pliku serializers.py należy jeszcze ukryć pole user_id oraz ustawić je jedynie do odczytu, tak aby nie było możliwości zmiany wartości tego pola.
class BorrowSerializer(serializers.ModelSerializer): book = serializers.ReadOnlyField(source='book_id.title') author_first_name = serializers.ReadOnlyField(source='book_id.author_id.first_name') author_last_name = serializers.ReadOnlyField(source='book_id.author_id.last_name') user_firts_name = serializers.ReadOnlyField(source='user_id.first_name') user_last_name = serializers.ReadOnlyField(source='user_id.last_name') user_email = serializers.ReadOnlyField(source='user_id.email') user_id = serializers.ReadOnlyField(source='user_id.id') # new class Meta: model = Borrow fields = ['id', 'user_id', 'user_firts_name', 'user_last_name', 'user_email', 'book_id', 'book', 'author_first_name', 'author_last_name', 'borrow_date', 'return_date']
Efekt naszej pracy zamieściłem poniżej. Jak możemy zobaczyć, w formularzu dla requesta POST nie ma już pola user_id, natomiast po wysłaniu tego requesta, wypożyczenie zostało przypisane do usera, który jest aktualnie zalogowany.
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