In Django rest framework model serializer, error when updating a model via viewset for a unique column [duplicate]

I am working on Django rest framework viewsets.

I try to update a model named machine by view set's default method update. In my model there is a unique field named machine_number. The model is given below.

class Machine(models.Model):
    id = models.AutoField(primary_key=True)
    machine_number = models.IntegerField(unique=True)
    count = models.FloatField(default=None, null=True)
    variety = models.CharField(max_length=255, default=None, null=True)
    lycra_draft = models.CharField(max_length=255, default=None, null=True)
    feedback = models.CharField(max_length=10000, default=None, null=True)
    csp = models.FloatField(default=None, null=True)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

and my serializer is:

class MachineSerializer(serializers.ModelSerializer):

    class Meta:
        model = Machine
        fields = ('id', 'machine_number', 'count', 'variety', 'lycra_draft', 'feedback', 'csp')

Now, when I update the model using this serializer it throws below error.

Machine with this machine number already exists.

To resolve this error I have overwrite the serializer's update method.

I want to avoid this.

My viewset:

class MachineViewSet(viewsets.ViewSet):
    serializer_class = MachineSerializer
    queryset = Machine.objects.all()

    def update(self, request, pk):
        try:
            machine = Machine.objects.get(pk=pk)
            request.data['machine_number'] = machine.machine_number
        except Machine.DoesNotExist:
            response = build_custom_response(False, 'Machine not found', '')
            return Response(response, status=status.HTTP_404_NOT_FOUND)

        serializer = self.serializer_class(data=request.data, partial=True)
        if serializer.is_valid():
            serializer.save()
            serialized_data = serializer.data
            success = True
            message = "Machine updated successfully"
            status_code = status.HTTP_200_OK
        else:
            success = False
            status_code = status.HTTP_400_BAD_REQUEST
            err_msg = '\n'
            error_list = [(serializer.errors[error][0]).capitalize() for error in serializer.errors]
            message = err_msg.join(error_list)

        data = serialized_data if 'serialized_data' in locals() else ''
        response = build_custom_response(success, message, data)
        return Response(response, status=status_code)

Could anyone help me with this.

Thanks for the help!!

Back to Top