Cipher
Cipher

Reputation: 2122

Not to pass ID in URL - UpdateApiView

I want to make update using my API. For that i am passing id in URL which is pk.

http://localhost:8000/api/manager/update/96

Where 96 is primary key. Now instead of passing id in url i want to pass id in body and update data. My url should look like this

http://localhost:8000/api/manager/update

Views.py

class ManagerUpdateAPIView(APIView):

    def post(self, request, pk, *args, **kwrgs):

        user = get_object_or_404(User, id=pk)
        userprofile = get_object_or_404(UserProfile, user=pk)

        serializer1 = EmployeeRegisterSerializer(user, data=request.data)
        serializer2 = EmployeeProfileSerializer(userprofile, data=request.data)

        user_role = ACLRoles.objects.get(id=4)

        if serializer1.is_valid() and serializer2.is_valid():

            serializer1.save()
            serializer2.save()

            return Response(status=status.HTTP_200_OK)
        print(serializer1.errors)
        print(serializer2.errors)
        return Response(status=status.HTTP_404_NOT_FOUND)

Serializers.py

class EmployeeProfileSerializer(serializers.ModelSerializer):
    class Meta:
        model = UserProfile
        fields = [  
                    'user_employee_id',
                    'user_phone', 
                    'user_payroll_id',
                    'user_hire_date',
                    'user_pay_rate',
                    'user_salaried',
                    'user_excempt',
                    'user_groups',
                    'user_state',
                    'user_city',
                    'user_zipcode', 
                    'user_status',
                ]

class EmployeeRegisterSerializer(serializers.ModelSerializer):
    # userprofile = EmployeeProfileSerializer(read_only=True)

    class Meta:
        model = User
        fields = ['first_name','last_name', 'email',]

How can i update data without passing id in url.

Upvotes: 0

Views: 601

Answers (1)

JPG
JPG

Reputation: 88579

Try this code

class ManagerUpdateAPIView(APIView):

    def post(self, request, *args, **kwrgs): #change is here
        pk = request.data['pk'] #change is here
        user = get_object_or_404(User, id=pk)
        userprofile = get_object_or_404(UserProfile, user=pk)

        serializer1 = EmployeeRegisterSerializer(user, data=request.data)
        serializer2 = EmployeeProfileSerializer(userprofile, data=request.data)

        user_role = ACLRoles.objects.get(id=4)

        if serializer1.is_valid() and serializer2.is_valid():
            serializer1.save()
            serializer2.save()

            return Response(status=status.HTTP_200_OK)
        print(serializer1.errors)
        print(serializer2.errors)
        return Response(status=status.HTTP_404_NOT_FOUND)

and provide pk in your POST payload as

{
    "pk":96,
    "other_data":"other data of your usual payload"
}

Upvotes: 1

Related Questions