Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

"Expected a list of items but got type \"dict\"."

I am trying to build a api for updating first and last name for my user. I am getting the following error in HTTP Response

{
    "non_field_errors": [
        "Expected a list of items but got type \"dict\"."
    ]
}

I have written the following API and trying to pass the patch request to it.

class UserSelfUpdateView(UpdateAPIView):
    serializer_class = UserUpdateSerializer
    permission_classes = [UserPermissions, ]

    def update(self, request: Request, *args, **kwargs):
        instance = User.objects.filter(id=self.request.user.id)
        serializer = UserUpdateSerializer(instance, data=request.data, many=True)
        serializer.is_valid(raise_exception=True)
        serializer.save()

        return Response({'success': True}, status=status.HTTP_200_OK)

The serializer for the above request is:

class UserUpdateSerializer(serializers.ModelSerializer):

    class Meta:
        model = User
        fields: ('id', 'first_name', 'last_name')

The format in which I am trying to pass my request body is:

{
    "first_name": "A",
    "last_name": "B"
}

The reason for using

instance = User.objects.filter(id=self.request.user.id)

is because I want the functionality in a way that only logged in user is able to modify his details only.

like image 206
VIBHOR GOYAL Avatar asked Apr 01 '19 07:04

VIBHOR GOYAL


1 Answers

The error is here

serializer = UserUpdateSerializer(instance, data=request.data, many=True)

change to

serializer = UserUpdateSerializer(instance, data=request.data)

if passing many=True you need to pass a queryset not an instance

like image 58
Jibin Mathews Avatar answered Sep 28 '22 14:09

Jibin Mathews