0

컨텍스트 : 중첩 된 직렬화기에 의해 유효성이 검사되는 필드에 액세스하는 데 문제가 있습니다. 아래 그림과 같이 매우 샘플 모델이 있습니다. 2 개 필드의 경우 해당 특정 serializer가 있습니다. 데이터에 액세스하려고하면 특정 serializer에서 유효성을 검사 한 필드를 제외한 모든 필드를 반환합니다.serializer.data에 일부 데이터가 누락되었습니다.

모델

class ExtractionsSerializer(serializers.BaseSerializer): 
    table_name = serializers.CharField() 
    extraction_type = serializers.ChoiceField(["ABC"]) 
    dependencies = serializers.ListField(child=RecursiveField(), allow_empty=True, required=False) 


class SamplingBySerializer(serializers.BaseSerializer): 
""" 
    Validate sampling_by 
""" 
    def to_internal_value(self, samples): 
     methods = ["ABC"] 
     sampling_not_supported = [sample for sample in samples 
           if sample['by'] not in methods] 
     if sampling_not_supported: 
      raise ValidationError("{} not in {}".format(sampling_not_supported, methods)) 

class SamplerSerializer(serializers.ModelSerializer): 
    extractions = ExtractionsSerializer(read_only=True) 
    sampling_by = SamplingBySerializer(read_only=True) 

    class Meta: 
     model = Sampler 
     fields = ('sample_name', 'database', 'schema', 'sampling_by', 'extractions', 'max_samples') 

가 지금은

data = { 
"database": "postgresql://..", 
"sampling_by":[{ 
    "by":"ABC", 
    "value": ["l32=turn_the"] 
}], 
"max_samples":3, 
"extractions" : [{ 
    "table_name": "person", 
    "extraction_type": "ABC" 
}] 
} 
sampler = SamplerSerializer(data=data) 
sampler.is_valid() #returns True 
sampler.data => does not contain data of the nested fields. Like the `sampling_by` and `extractions`. Contains all other fields 
sampler.validated_data => same problem as above 

어떤 도움을 주시면 감사하겠습니다

을이

class Sampler(models.Model): 
    sample_name = models.CharField(unique=True, max_length=100) 
    sampling_by = JSONField(max_length=100) 
    extractions = JSONField(max_length=100) 
    max_samples = models.IntegerField(default=100) 

직렬 변환기처럼 보인다! 감사

답변

0

당신은 아마 당신의 중첩 된 시리얼은, 그 부분을 제거 구현 read_only=True

class SamplerSerializer(serializers.ModelSerializer): 
    extractions = ExtractionsSerializer(read_only=True) 
    sampling_by = SamplingBySerializer(read_only=True) 

플래그가 있다는 사실을 놓친 시리얼 라이저의 create/update 당신이 갈 수 있어요.

비 직렬화시 serializer.data에 액세스하는 것이 의미가 없습니다.

편집 : 권한 소스는 validated_data입니다.

+0

어떻게 데이터에 액세스합니까? 'serializer.data'가 아니라면 –

+0

나는 당신이 말한 것처럼 위와 같이했다. 'read_only = True'를 삭제하고 시리얼 라이저에 create를 구현했습니다. 하지만 이제는 나에게 "to_internal_value() 구현해야합니다"오류가 발생합니다. 나는 왜 그 오류를 이해하지 못합니다! –

+0

아마도 RecursiveField에 문제가 있습니다. – Linovia

관련 문제