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'を削除し、シリアライザのcreateを実装しました。しかし今、それは私にエラー "to_internal_value()を実装する必要があります"を与える 私はかなりその理由を理解していない! –

+0

これはおそらく、RecursiveFieldの問題です。 – Linovia

関連する問題