2

나는이 같은 JSON 직렬화하려고에 대한 사용자 정의 to_internal_value 내에서 실행 필드 검증 : 공백 필드가있는 시리얼을 작성장고 REST - 시리얼

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

은 허용되지 않습니다 (때문에 파이썬 변수의 과정) 그래서 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

Serializer 클래스는 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'] 
     } 
관련 문제