如何在Django序列化程序中写入嵌套的父级

如何在Django序列化程序中写入嵌套的父级,django,django-rest-framework,Django,Django Rest Framework,我正在使用Django序列化程序来创建一个API,我可以对它进行读取和写入 型号: class Biomarker(models.Model): low_value_description = models.TextField(blank=True, null=True) high_value_description = models.TextField(blank=True, null=True) class BiomarkerReading(models.Model):

我正在使用Django序列化程序来创建一个API,我可以对它进行读取和写入

型号:

class Biomarker(models.Model):
    low_value_description = models.TextField(blank=True, null=True)
    high_value_description = models.TextField(blank=True, null=True)

class BiomarkerReading(models.Model):
    biomarker = models.ForeignKey(Biomarker, on_delete=models.CASCADE)
    test = models.ForeignKey(Test, on_delete=models.CASCADE)
    value = models.DecimalField(max_digits=30, decimal_places=8, default=0)
序列化程序:

class BiomarkerReadingSerializer(serializers.ModelSerializer):
    class Meta:
        model = BiomarkerReading
        fields = (
            'id', 'test', 'biomarker', 'value'
        )
JSON格式:

{
    "id": 617188,
    "test" 71829, 
    "biomarker": 32,
    "value": 0.001
}
以上所有内容都很有效,我可以用JSON格式对其进行读写。但是,我现在需要从父模型添加一些字段,以便响应如下所示:

{
    "id": 617188,
    "test" 71829, 
    "biomarker": {
        "id": 32,
        "low_value_description": "All good",
        "high_value_description": "You will die",
    },
    "value": 0.001
}
{
    "id": 617188,
    "test" 71829, 
    "biomarker": 32,
    "value": 0.001
}
{
    "id": 617188,
    "test" 71829, 
    "biomarker": {
        "id": 32,
        "low_value_description": "All good",
        "high_value_description": "You will die",
    },
    "value": 0.001
}
我已使用以下序列化程序使读取部分正常工作:

class BiomarkerDescriptionSerializer(serializers.ModelSerializer):
    class Meta:
        model = Biomarker
        fields = ('id', 'low_value_description', 'high_value_description')

class BiomarkerReadingSerializer(serializers.ModelSerializer):
    biomarker = BiomarkerDescriptionSerializer()
    class Meta:
        model = BiomarkerReading
        fields = (
            'id', 'test', 'biomarker', 'value'
        )
但是,我找不到一种使用旧json格式(json中带有
“biomarker”:32
)写入的方法

我想我需要在
验证
创建
中执行一些操作,但在它到达这些方法之前,我得到了400个响应:

class BiomarkerReadingSerializer(serializers.ModelSerializer):
    
    ... # as above

    def validate(self, data):
        print('validate')  # Doesn't print
        data = super().validate(data)
        return data

    def create(self, validated_data):
        print('create')  # Doesn't print
        return super().create(validated_data)
文档中的示例和我在上面找到的其他示例只讨论在写入父记录序列化程序时创建子记录的情况,而不是相反的情况

我不想通过API
创建
一个父生物标记,我只需要能够像以前一样通过传入JSON中的
pk/id
引用它

我不介意是否必须将传入密钥的名称更改为类似以下内容:

{
    "id": 617188,
    "test" 71829, 
    "biomarker_id": 32,
    "value": 0.001
}
或者类似这样的回答:

{
    "id": 617188,
    "test" 71829, 
    "biomarker": 32,
    "descriptions": {
        "low_value_description": "All good",
        "high_value_description": "You will die",
    },
    "value": 0.001
}

使用
depth=1
选项将解决您的问题

类生物标记物序列化器(serializers.ModelSerializer):
类元:
模型=生物标记物阅读
字段=(
“id”、“测试”、“生物标记物”、“值”
)
深度=1

看一看:

我讨厌回答我自己的问题,但解决方案是将
序列化程序子类化。RelatedField
,这在中进行了解释

这使您可以单独控制值(实例)如何表示为序列化,以及如何使用序列化数据检索或创建值(实例)

被重写的
get\u queryset
是必需的,即使它什么也不做

这意味着输入的数据如下所示:

{
    "id": 617188,
    "test" 71829, 
    "biomarker": {
        "id": 32,
        "low_value_description": "All good",
        "high_value_description": "You will die",
    },
    "value": 0.001
}
{
    "id": 617188,
    "test" 71829, 
    "biomarker": 32,
    "value": 0.001
}
{
    "id": 617188,
    "test" 71829, 
    "biomarker": {
        "id": 32,
        "low_value_description": "All good",
        "high_value_description": "You will die",
    },
    "value": 0.001
}
然而,数据的输出看起来是这样的:

{
    "id": 617188,
    "test" 71829, 
    "biomarker": {
        "id": 32,
        "low_value_description": "All good",
        "high_value_description": "You will die",
    },
    "value": 0.001
}
{
    "id": 617188,
    "test" 71829, 
    "biomarker": 32,
    "value": 0.001
}
{
    "id": 617188,
    "test" 71829, 
    "biomarker": {
        "id": 32,
        "low_value_description": "All good",
        "high_value_description": "You will die",
    },
    "value": 0.001
}

感谢那些提供答案的人,非常感谢

不幸的是,
测试
字段是一个FK,我确实需要将它链接到家长。