Как написать метод для PUT и для PATCH?

Необходимо реализовать PUT и PATCH методы. именно и то и другое.

Прочел, что PUT должен очистить не переданные ему аргументы, а PATCH именно внесет изменения в указанное поле. Данный метод работает как PATCH.

Вырезка из ТЗ
URLS ROUS WOUS

Это только часть кода, касающаяся PUT и PATCH, по ТЗ должна быть реализована вся CRUD, с токен аутентификацией. Все это уже реализовано, осталось только разобраться с PUT/PATCH. Поэтому это не весь код, а лишь его часть

**serializers.py**

class UserSerializer(serializers.ModelSerializer):

    first_name = serializers.CharField(max_length=30)
    last_name = serializers.CharField(max_length=150)
    is_active = serializers.BooleanField()


    class Meta:
        model = CustomUser
        fields = [
            'id',
            'username',
            'is_active',
            'first_name',
            'last_name',
            'last_login',
            'is_superuser',
        ]

    def update(self, instance, validated_data):
        instance.first_name = validated_data.get('first_name', instance.first_name)
        instance.last_name = validated_data.get('last_name', instance.last_name)
        instance.is_active = validated_data.get('is_active', instance.is_active)
        instance.save()

        return instance
**views.py**

class UserViewSet(ListAPIView):

    # Allow only authenticated users to access this urls
    permission_classes = [IsAuthenticated, ]
    serializer_class = UserSerializer

def patch(self, request, **kwargs):
        saved_user = CustomUser.objects.get(pk=kwargs['pk'])
        data = request.data
        serializer = UserSerializer(instance=saved_user, data=data, partial=True)
        if serializer.is_valid(raise_exception=True):
            saved_user = serializer.save()
        return Response({
            "success": f"User with username '{saved_user}' updated successfully"})

Как написать метод для PUT ?

как я понял, если передать Postman-ом PUT http://127.0.0.1:8000/api/v1/users/6/ {"first_name": "Lama"} , остальные поля, не указанные в теле запроса, должны очиститься...


Ответы (1 шт):

Автор решения: 5c0rp

Думаю что сериализатор можно упростить до

**serializers.py**

class CustomUserSerializer(serializers.ModelSerializer):

    class Meta:
        model = CustomUser
        fields = [
            'id',
            'username',
            'is_active',
            'first_name',
            'last_name',
            'last_login',
            'is_superuser',
        ]

А ваше представление изменить на

**views.py**

from rest_framework.routers import SimpleRouter
from rest_framework.viewsets import ModelViewSet


class UserViewSet(ModelViewSet):
    queryset = CustomUser.objects.all()
    permission_classes = [IsAuthenticated, ]
    serializer_class = CustomUserSerializer


router = SimpleRouter()
router.register('users', UserViewSet)

Ну и добавить роутер в urlpatterns

urlpatterns += router.urls
→ Ссылка