使用HTTP请求触发django rest框架update()函数

时间:2018-07-09 02:37:37

标签: django rest http django-rest-framework django-views

我上周刚开始学习django,所以如果我完全错误地解决了这个问题,请原谅我的无知。

因此,我一直遵循thinkster tutorial设置用户模型,该模型允许更改模型中的密码。到目前为止,我有一个指向该视图的网址(/ api / user):

class UserRetrieveUpdateAPIView(RetrieveUpdateAPIView):
    permission_classes = (IsAuthenticated,)
    renderer_classes = (UserJSONRenderer,)
    serializer_class = UserSerializer

    def retrieve(self, request, *args, **kwargs):
        #turns the object recieved into a JSON object
        serializer = self.serializer_class(request.user)
        return Response(serializer.data, status=status.HTTP_200_OK)

    def update(self, request, *args, **kwargs):
        serializer_data = request.data
        serializer = self.serializer_class(
            request.user, data=serializer_data, partial=True
        )
        serializer.is_valid(raise_exception=True)
        serializer.save()

        return Response(serializer.data, status=status.HTTP_200_OK)

我了解此部分:

serializer = self.serializer_class(
        request.user, data=serializer_data, partial=True
    )
    serializer.is_valid(raise_exception=True)
    serializer.save()

将按照以下方式调用序列化程序类:

class UserSerializer(serializers.ModelSerializer):
    #This class handles serialization and deserialization of User objects
    password = serializers.CharField(
        max_length=128,
        min_length=8,
        write_only=True
    )
    class Meta:
        model = User
        fields = ('email', 'username', 'password', 'token',)
        read_only_fields=('token',)

    def update(self, instance, validated_data):
        #performs an update on the user
        password = validated_data.pop('password', None) 
        #have to take out password because setattr does not handle hashing etc

        for (key, value) in validated_data.items():
            #for the keys after taking out password set them to the updating User instance
            setattr(instance, key, value)

        if password is not None:
            instance.set_password(password) #set_password is handled bydjango 

        instance.save() #set_password does not save instance
        return instance
再次

我理解本节将基本上采用request.data并“更新”模型。但是,我对如何使用Postman测试此功能感到困惑。

当前,当我使用邮递员向URL发送GET请求时,得到以下响应:

GET Request result

响应基于我的使用JWT身份验证的身份验证类。 我的问题是,如何使用邮递员HTTP请求触发该更新功能。

1 个答案:

答案 0 :(得分:1)

PATCH(部分更新)或PUT(更新)http://127.0.0.1:8000/api/user/user_id/

您可以看到路由器表here