【问题标题】:Triggering a django rest framework update() function using HTTP Requests使用 HTTP 请求触发 django rest 框架 update() 函数
【发布时间】:2018-07-09 11:03:17
【问题描述】:

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

所以我一直在关注thinkster tutorial 设置允许在模型中更改密码的用户模型。到目前为止,我有一个指向此视图的 url (/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 测试此功能。

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

GET Request result

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

【问题讨论】:

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


【解决方案1】:

PATCH(partial_update) 或 PUT(update) http://127.0.0.1:8000/api/user/user_id/

你可以看到路由表here

【讨论】:

    猜你喜欢
    • 2015-06-18
    • 2018-05-02
    • 2013-11-07
    • 2014-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-31
    相关资源
    最近更新 更多