Поле обновления Django Rest Framework

Я новичок в DRF, и я пытаюсь написать специальный просмотр/сериализатор, который я могу использовать для обновления только одного поля пользовательского объекта.

Мне нужно сделать логику, чтобы обновить "имя" пользователя.

Я написал сериализатор:

class ClientNameSerializer(serializers.ModelSerializer):
    class Meta:
        model = ClientUser
        fields = ('name',)

    def update(self, instance, validated_data):
        instance.name = validated_data.get('name', instance.name)
        instance.save()
        return instance

Этот метод никогда не вызывается. Я попытался установить там контрольную точку и отладить ее, но ее никогда не вызывают, даже если я использую методы PUT, POST или PATCH. Если я добавлю метод create, он вызывается, когда я использую POST.

Это выглядит так:

class UpdateName(generics.CreateAPIView):
    queryset = ClientUser.objects.all()
    serializer_class = ClientNameSerializer
    permission_classes = (permissions.IsAuthenticated,)

Есть ли у кого-нибудь предложение? Спасибо!

Мой models.py выглядит следующим образом

class ClientUser(models.Model):
    owner = models.OneToOneField(User,unique=True,primary_key=True)

    phone_number = models.CharField(validators=[PHONE_REGEX],max_length=20,unique=True)

    name = models.CharField(max_length=100,blank=True)
    status = models.IntegerField(default=1)
    member_from = models.DateTimeField('member from',auto_now_add=True)
    is_member = models.BooleanField(default=False)

Ответы

Ответ 1

Определение того, какие методы принимает конечная точка, выполняется в представлении, а не в сериализаторе.

Метод обновления, который у вас есть под вашим сериализатором, необходимо перенести в ваше представление, чтобы у вас было что-то вроде:

# serializers.py
class ClientNameSerializer(serializers.ModelSerializer):
    class Meta:
        model = ClientUser

# views.py
class UpdateName(generics.UpdateAPIView):
    queryset = ClientUser.objects.all()
    serializer_class = ClientNameSerializer
    permission_classes = (permissions.IsAuthenticated,)

    def update(self, request, *args, **kwargs):
        instance = self.get_object()
        instance.name = request.data.get("name")
        instance.save()

        serializer = self.get_serializer(instance)
        serializer.is_valid(raise_exception=True)
        self.perform_update(serializer)

        return Response(serializer.data)

Обратите внимание, что вы переопределяете UpdateModelMixin, и вам может потребоваться немного изменить приведенный выше код, чтобы все было правильно.