【问题标题】:serializer.data is missing some of the dataserializer.data 缺少一些数据
【发布时间】:2017-04-13 22:20:28
【问题描述】:

上下文:我在访问由嵌套序列化程序验证的字段时遇到问题。 我有一个非常示例的模型,如下所示。 对于其中 2 个字段,我有其特定的序列化程序。当我尝试访问数据时,它会返回除特定序列化程序验证的字段之外的所有字段。

模型看起来像这样

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

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

【问题讨论】:

    标签: django django-models django-rest-framework django-serializer


    【解决方案1】:

    您可能错过了嵌套序列化程序被标记为read_only=True的事实

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

    删除那部分,实现序列化程序的 create / update 就可以了。

    附带说明,在反序列化时访问 serializer.data 是没有意义的。

    编辑:权限来源为validated_data

    【讨论】:

    • 我如何访问数据?如果不是serializer.data
    • 我按照你说的做了。删除了read_only=True,然后为序列化程序实现了创建。但现在它给了我错误“to_internal_value() 必须实现”我不太明白为什么会出现这个错误!
    • 这可能是 RecursiveField 的问题。
    猜你喜欢
    • 2020-04-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-04
    • 1970-01-01
    • 1970-01-01
    • 2022-01-22
    • 2012-06-12
    • 2011-04-24
    相关资源
    最近更新 更多