Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Django Rest Framework update field

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) 
like image 508
Bob Avatar asked Jul 01 '15 23:07

Bob


People also ask

What is Read_only true in Django?

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.

What are Serializers in Django REST framework?

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.

How do you pass extra context data to Serializers in Django REST framework?

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.


1 Answers

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.

like image 80
awwester Avatar answered Sep 17 '22 16:09

awwester