michael-mammut
michael-mammut

Reputation: 2783

How to update a model in the Database with Django Rest Framwork Serializer fails?

If I run my code at the first time, it works successfully. Data are stored in the database and the http code is 200. If I change some data on the client side and try to save the model again, I reach the following error.

I read on the django doc, hat i can use Save as "create" and "update" as well.

error message

heating mapping with this zone already exists

views.py

from heatingControll.models import  HeatingMapping as HeatingMappingModel
 # ... some code ...
    @detail_route(methods="post")
    def save(self, request):
        zone = request.data.get('zone')
        data = json.loads(zone)

        serializer = HeatingMappingSerializer(data=data)

        valid = serializer.is_valid(raise_exception=True)
        if(valid):
           result = serializer.save()
           self.response = {"result": True, "data":HeatingMappingSerializer(result).data, "message": "Erfolgreich gespeichert"}

        return JsonResponse(self.response, safe=False)

SOLUTION supported by zaidfazil

@detail_route(methods="post") def save(self, request): zone = request.data.get('zone') data = json.loads(zone)

if 'zone' in data:
    obj = HeatingMappingModel.objects.get(id=data.get('id'))
    serializer = HeatingMappingSerializer(data=data, instance=obj)
else:
    serializer = HeatingMappingSerializer(data=data)

valid = serializer.is_valid(raise_exception=True)
if(valid):
   result = serializer.save()
   self.response = {"result": True, "data":HeatingMappingSerializer(result).data, "message": "Erfolgreich gespeichert"}

return JsonResponse(self.response, safe=False)

Upvotes: 0

Views: 1333

Answers (1)

zaidfazil
zaidfazil

Reputation: 9235

Try editing your view maybe like this,

@detail_route(methods="post")
def save(self, request, pk):
    zone = request.data.get('zone')
    data = json.loads(zone)
    obj = HeatingMapping.objects.get(pk=pk)

    serializer = HeatingMappingSerializer(data=data, instance=obj)

    valid = serializer.is_valid(raise_exception=True)
    if(valid):
       result = serializer.save()
       self.response = {"result": True, "data":HeatingMappingSerializer(result).data, "message": "Erfolgreich gespeichert"}

    return JsonResponse(self.response, safe=False)

Upvotes: 0

Related Questions