I am new to DRF and I am trying to write custom view / serializer that I can use to update just one field of user object.
I need to make logic just to update the "name" of the user.
I wrote serializer:
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
This method is never called. I tried setting breakpoint there and debug it, but it is never called, even if I use PUT, POST or PATCH methods. If I add create method it is being called when I use POST.
This is how my view looks like:
class UpdateName(generics.CreateAPIView): queryset = ClientUser.objects.all() serializer_class = ClientNameSerializer permission_classes = (permissions.IsAuthenticated,)
Does anyone have some suggestion? Thanks!
My models.py looks like this
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)
Any 'read_only' fields that are incorrectly included in the serializer input will be ignored. Set this to True to ensure that the field is used when serializing a representation, but is not used when creating or updating an instance during deserialization.
Serializers in Django REST Framework are responsible for converting objects into data types understandable by javascript and front-end frameworks. Serializers also provide deserialization, allowing parsed data to be converted back into complex types, after first validating the incoming data.
In function based views we can pass extra context to serializer with "context" parameter with a dictionary. To access the extra context data inside the serializer we can simply access it with "self. context". From example, to get "exclude_email_list" we just used code 'exclude_email_list = self.
The definition of what methods the endpoint can accept are done in the view, not in the serializer.
The update method you have under your serializer needs to be moved into your view so you'll have something like:
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)
Take note that you're overriding the UpdateModelMixin and you might need to change the above code a little bit to get it right.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With