2017-04-05 109 views
0

在构建基于django的Web应用程序的过程中,遇到了一个错误,我无法解决该如何解决。在应用中,我的Angular2前端发送POST请求,其传递给后端的以下形式的JSON对象:Django Rest-Framework序列化程序:肯定存在的字段上抛出的KeyError

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

在接收到该请求的节目的流程进到后功能,它在以下视图中定义,它从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的服务器接收到一个请求,我得到以下异常:

KeyError: 'name'

During handling of the above exception, another exception occurred:

KeyError: "Got KeyError when attempting to get a value for field name on serializer VariableNameSerializer . The serializer field might be named incorrectly and not match any attribute or key on the dict instance. Original exception text was: 'name'."

据我了解,这我不知道是正确的,错误的意思是,它找不到名为'name'的字段,该字段会引发KeyError。然而,一个'名字'字段当然存在,就像你在我的代码中看到的那样。请注意,在这两个错误中,堆栈跟踪都没有包含我写的任何函数,我发现这些函数很奇怪,并且是初学者,我从来没有遇到过这样的事情。

回答

1

不知何故,您从验证返回{'value':value}而不是{'name':value},这会混淆DRF。

编辑: 如果你真的需要value,而不是name,你还需要将source参数添加到字段:

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

它可能已经在验证的数据被转换成价值,而不是死的肯定关于。

+0

你是对的,这工作。但是,如果我想让JSON拥有一个名为“value”的属性,而不是“name”,那么这是不可能的? –

+0

编辑回复。 – Linovia

相关问题