Поле обновления 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, и вам может потребоваться немного изменить приведенный выше код, чтобы все было правильно.