Django – #31 – REST API cz. 7 – Określenie z góry wartości danych

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ść.

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.  

Autor artykułu
Dominik Bednarski

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany.