2

私はこのようなJSONシリアライズしようとしているため、カスタムto_internal_value内から実行フィールド検証:スペースでフィールドを持つシリアライザを書くジャンゴREST - シリアライザ

{ 
    "Some URL": "https://helloworld.com/", 
    "Some Integer": 12 
    "Some Dictionary": { 
     "Nested Array": [...] 
     "Nested Dictionary": {...} 
    } 
} 

は許可されていません(理由はPythonの変数のコース) 、私はBaseSerializerをサブクラス化しようとしています。

class MyNestedSerializer(serializers.BaseSerializer): 

    def to_internal_value(self, data): 
     nested_array = data.get('Nested Array') 
     nested_dictionary = data.get('Nested Dictionary') 

     # Validation 
     .... 
     .... 

     return { 
      'Nested Array': nested_array, 
      'Nested Dictionary': nested_dictionary 
     } 

    def to_representation(self, instance): 
     return { 
      'Nested Array': instance['Nested Array'], 
      'Nested Dictionary': instance['Nested Dictionary'] 
     } 


class MySerializer(serializers.BaseSerializer): 

    def to_internal_value(self, data): 
     some_url = data.get('Some URL') 
     some_integer = data.get('Some Integer') 
     some_dictionary = data.get('Some Dictionary') 

     # Validation 
     .... 
     nested_serializer = MyNestedSerializer(data=some_dictionary) 
     nested_serializer.is_valid(raise_exception=True) 
     .... 

     return { 
      'Some URL': some_url, 
      'Some Integer': some_integer, 
      'Some Dictionary': some_dictionary 
     } 

    def to_representation(self, instance): 
     return { 
      'Some URL': instance['Some URL'] 
      'Some Integer': instance['Some Integer'] 
      'Some Dictionary': instance['Some Dictionary'] 
     } 

は今、通常、私はこのようなシリアライザ(ないBaseSerializer)でフィールドタイプを定義します

class BasicSerializer(serializers.Serializer): 
    some_integer = serializers.IntegerField(min_value=0) 
    some_dictionary = serializers.DictField(child=serializers.CharField()) 

とフィールド検証が発生します。私が望むのは、私自身のバリデーションを書くのではなく、to_internal_valueの実装の中でこれらのバリデータを実行させることです。すでに書かれているものを書き直すのは意味がありませんが、BaseSerializerで基本的な検証を実行する方法を理解できないようです。

+0

遅れて申し訳ありませんが、電子メールによる通知はありません。とにかくあなたの答えは、私が望むものを達成するのを助けました。私はそれを受け入れた。 – gdeamont

+0

助けてくれてうれしいです。 – e4c5

答えて

1

シリアライザクラスはsubclass of BaseSerializerです。したがって、このシナリオでは、実際にBaseSerializerから派生する必要はありませんが、代わりにSerializerを使用することができます。

class MySerializer(serializers.Serializer): 


    def to_internal_value(self, data): 
     some_url = data.get('Some URL') 
     some_integer = data.get('Some Integer') 
     some_dictionary = data.get('Some Dictionary') 

     # Validation 
     .... 
     nested_serializer = MyNestedSerializer(data=some_dictionary) 
     nested_serializer.is_valid(raise_exception=True) 
     .... 

     return { 
      'Some URL': some_url, 
      'Some Integer': some_integer, 
      'Some Dictionary': some_dictionary 
     } 

    def to_representation(self, instance): 
     return { 
      'Some URL': instance['Some URL'] 
      'Some Integer': instance['Some Integer'] 
      'Some Dictionary': instance['Some Dictionary'] 
     } 
関連する問題