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