简体   繁体   中英

Django Rest Framework: User Update

I know this has been discussed and it's basic but I can't find what is wrong with it. I've pulled up my old projects (which works!) and corresponded to what I did. It never reaches to update in serializer, and I'm at lost why. I dont know what else I'm missing.

Error :

{"last_name":["This field may not be null."],"pass… null."],"email":["This field may not be null."]}, status: 400

frontend patch('api/getprofile')

django/DRF serializer :

class UserSerializer(serializers.ModelSerializer):
    first_name = serializers.CharField()
    last_name = serializers.CharField()
    email = serializers.EmailField()
    password = serializers.CharField(style={'input_type': 'password'})

    class Meta:
        model = User
        fields = '__all__'

    def create(self, validated_data):
        user = User.objects.create(
            username=validated_data.get('username'),
            email=validated_data.get('email'),
            password=validated_data.get('password')
        )
        user.set_password(validated_data.get('password'))
        user.save()
        return user

    def update(self, instance, validated_data):
        #print instance <-- if never gets here... is update not update
        for key, value in validated_data.items():
            if value:
                print value
                setattr(instance, key, value)
        instance.save()
        return instance   

views.py

class UserRetrieveUpdateAPIView(generics.RetrieveUpdateAPIView):
    serializer_class = UserSerializer
    permission_classes = (IsAuthenticated, )
    queryset = User.objects.all()

    def get_object(self):
        return self.request.user

    def update(self, request, *args, **kwargs):
        serializer = UserSerializer(data=request.data, partial=True)
        serializer.is_valid(raise_exception=True)
        self.perform_update(serializer)
        instance = serializer.instance
        return Response(UserSerializer(instance=instance).data, status=status.HTTP_200_OK)

The only implementation that you may need to provide for your APIView is the get_object method.

From the source for mixins.UpdateMixins , update (for HTTP PUT requests) and partial_update are implemented as you have it.

The override for the mixins.UpdateMixins.update you provide allows partial updates on HTTP PUT requests and misses passing the model instance to the serializer for the update. ie

serializer = UserSerializer(self.get_object(), data=request.data, partial=True)

I however suggest to not perform the override for mixins.UpdateMixins.update in the current manner.
Use the standard handling of the HTTP requests implemented in mixins.UpdateMixins and only provide your implementation for .get_object() .

You do this already with UserRetrieveUpdateAPIView.get_object() .

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM