Django Rest-Framework Serializer:在肯定存在的字段上抛出KeyError

时间:2017-04-05 15:36:25

标签: python django django-rest-framework

在构建基于django的Web应用程序的过程中,我遇到了一个错误,我无法想出如何解决。在应用程序中,我的Angular2前端发送一个post请求,该请求将后面的JSON对象传递给后端:

{
    "variable": {
        "name": "testVar"
    }
}

收到请求后,程序流程转到post函数,post函数在以下视图中定义,该函数继承自django rest-framework的APIView。

class VariableAPIView(APIView):

    permission_classes = (AllowAny, )
    renderer_classes = (VariableJSONRenderer, )
    serializer_class = VariableNameSerializer

    def post(self, request):
        variable = request.data.get('variable', {})
        serializer = self.serializer_class(data=variable)
        serializer.is_valid(raise_exception=True)

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

序列化程序的主要逻辑发生在这段代码中。

class VariableNameSerializer(serializers.Serializer):
    name = serializers.CharField(max_length=255)

    def validate(self, data):
        name = data.get('name', None)

        if name is None:
            raise serializers.ValidationError('A variable name is required.')

        try:
            value = server.ReadVariable(name)
        except Exception:
            raise serializers.ValidationError('A variable with this name could not be found')

        return {
            'value': value,
        }

当django-server收到请求时,我得到以下异常:

  

KeyError:'name'

     

在处理上述异常期间,发生了另一个异常:

     

KeyError:“在序列化程序name上尝试获取字段VariableNameSerializer的值时出现KeyError。序列化程序字段可能名称不正确,与dict上的任何属性或键都不匹配实例。原始异常文本是:'name'。“

根据我的理解,我不确定是对的,错误的含义是它找不到一个名为'name'的字段,它抛出一个KeyError。但是,您可以在我的代码中看到“名称”字段。请注意,在这两个错误中,堆栈跟踪不包括我写的任何函数,我觉得这很奇怪并且是初学者,我从来没有遇到过这样的事情。

1 个答案:

答案 0 :(得分:1)

不知何故,你从validate而不是{'name':value}返回{'value':value},这会让DRF感到困惑。

编辑: 如果您确实需要value而不是name,则还需要在字段中添加source参数:

name = serializers.CharField(source='value', max_length=255)

它可能已经被转换为验证数据中的值,而不是确定的。