2017-04-05 1 views
0

DjangoベースのWebアプリケーションを構築する過程で、私はエラーを見つけました。アプリケーションでは、私のAngular2フロントエンドは、バックエンドに次の形式のJSONオブジェクトを渡しPOSTリクエストを送信: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, 
     } 

:私は右であることを確認していない私が理解から

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

何とか{'name':value}の代わりに{'value':value}を返すと、DRFが混乱します。

編集: あなたが本当にvalue代わりのnameが必要な場合、あなたはまた、フィールドにsource引数を追加する必要があります。

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

それはすでに死んわからない、検証のデータの値に変換することができます約。

+0

あなたが正しいです、これは機能しました。しかし、JSONに '' name ''の代わりに '' value''というプロパティを持たせたいのであれば、それは不可能でしょうか? –

+0

レスポンスが編集されました。 – Linovia

関連する問題