Django Rest Framework:不明确的错误消息

时间:2017-06-06 21:51:15

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

我的 views.py

class user_password(generics.UpdateAPIView):
    authentication_classes = ([JSONWebTokenAuthentication])
    serializer_class = user_password_serializer

    def get_queryset(self):
        return User.objects.get(id=self.request.user.id)

但是我在运行时得到了这个:

  

AssertionError:使用名为“pk”的URL关键字参数调用的预期视图user_password。修复您的网址,或者在视图上正确设置.lookup_field属性。

我知道序列化器是可以的,因为当我使用不同类型的View进行相同的操作时。它有效:

class user_password(APIView):

    authentication_classes = ([JSONWebTokenAuthentication])

    def put(self, request, format=None):

        serializer = user_password_serializer(data=request.data)
        if serializer.is_valid():
            if request.user.check_password(serializer.validated_data[
                                                'old_password']):
                request.user.set_password(serializer.validated_data[
                                          'new_password'])
                request.user.save()

                return Response({'success': True,
                                'result': serializer.validated_data},
                                status=status.HTTP_200_OK)
            else:
                    return Response({'success': False,
                                    'result': "credential mismatch"},
                                    status=status.HTTP_401_UNAUTHORIZED)


        return Response({'success': False,
                        'result': serializer.errors},
                        status=status.HTTP_400_BAD_REQUEST)

我不希望改变端点的构造方式。我确实有一个JWT认证呼叫,我希望/用户/密码只能将“旧密码”和“新密码”输入同一个用户。

generics.UpdateAPIView班的错误是什么?这是.lookup_field它在谈论什么?

1 个答案:

答案 0 :(得分:1)

.lookup_feild是您的网址格式中UpdateAPIView所期望的字段(捕获组)(默认情况下为pk),如:

r'^user/(?P<pk>\d+)/password/?$'

但是,您应该能够覆盖get_object而不是get_queryset,而且无需对网址进行任何更改即可。

class user_password(generics.UpdateAPIView):
    authentication_classes = ([JSONWebTokenAuthentication])
    serializer_class = user_password_serializer

    def get_object(self):
        return User.objects.get(id=self.request.user.id)

另外,简单地返回self.request.user就可以了(我不知道你的项目中JWT认证是如何实现的,但是大多数时候Django都会在request.user中提取用户模型)。