0

上下文:我有问题访问其通过嵌套串行验证字段。 我有一个非常简单的示例模型,如下所示。 对于其中的2个字段,我有他们特定的序列化器。当我尝试访问数据时,它将返回除特定序列化器验证的字段之外的所有字段。serializer.data丢失某些数据

模型看起来像这样

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) 

串行器

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 

任何帮助,将不胜感激!感谢

回答

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',然后实现了序列化器的创建。但现在它给了我错误“to_internal_value()必须实现” 我不太明白为什么那个错误! –

+0

这可能是RecursiveField的一个问题。 – Linovia