deep
deep

Reputation: 153

unable to update existing data using Django Rest Framework?

I am new to Django rest framework and tying to update existing data in database. But in place of update a new data is added into database.

serializers.py

class CustomersSerializer(serializers.Serializer):
    lname = serializers.CharField(max_length=10)
    fname = serializers.CharField(max_length=10)

    def create(self, validated_data):
        return Customers.objects.create(**validated_data)

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

view.py

def UpdateData(request):  # Not Working
    user = Customers.objects.get(id=1)
    serialize = CustomersSerializer(user)
    json_data = JSONRenderer().render(serialize.data)
    stream = io.BytesIO(json_data)
    data = JSONParser().parse(stream)
    serializer = CustomersSerializer(data=data)
    if serializer.is_valid():
        temp_dict = serializer.validated_data
        temp_dict['fname'] = "abcd"
        serializer.save()
    return HttpResponse("Updated..")

If my whole process is wrong someone please suggest me some good resources to understand serializers and django rest framework.

What i have learned is Calling .save() will either create a new instance, or update an existing instance, depending on if an existing instance was passed when instantiating the serializer class.

Upvotes: 0

Views: 1437

Answers (1)

Madmax
Madmax

Reputation: 125

def UpdateData(request):  # Not Working
    ##payload send in request(fields with value which are changed) in request.data 
    request_data = request.data 
    payload = {
    'fname' : 'test',
    'lname' : 'user'  
    }
    user = Customers.objects.get(id=1)
    serialize = CustomersSerializer(user,payload,partial=True)

    ##specify renderers/decoders settings in settings.py/config.py
  
    if serializer.is_valid():
        ##don't know why you need this.
        temp_dict = serializer.validated_data
        temp_dict['fname'] = "abcd"
        ###
        serializer.save()
        return HttpResponse("Updated..")
    return HttpResponse('error in update {}'.format(serializer.errors))
    

See the change in serializer, first retrieve the object to be updated which is user followed by dictionary containing the fields and value to update and partial=True specifying partial update.

For Saving new object directly pass the payload in serializer followed by .save()

serializer = CustomersSerializer(data=payload)
if serializer.is_valid():
    serializer.save()

For PUT operation send the complete updated data of Customer

customer = Customer.objects.get(id=1) 
serializer = CustomersSerializer(customer,data=payload)
    if serializer.is_valid():
        serializer.save()

Upvotes: 2

Related Questions