在构建基于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。但是,您可以在我的代码中看到“名称”字段。请注意,在这两个错误中,堆栈跟踪不包括我写的任何函数,我觉得这很奇怪并且是初学者,我从来没有遇到过这样的事情。
答案 0 :(得分:1)
不知何故,你从validate而不是{'name':value}返回{'value':value},这会让DRF感到困惑。
编辑:
如果您确实需要value
而不是name
,则还需要在字段中添加source
参数:
name = serializers.CharField(source='value', max_length=255)
它可能已经被转换为验证数据中的值,而不是确定的。