Django Rest Framework多个嵌套的可写序列化器 [英] Django Rest Framework Multiple Nested Writable Serializers

查看:61
本文介绍了Django Rest Framework多个嵌套的可写序列化器的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试使用django rest框架实现多个嵌套的可写序列化程序.我已经阅读了 http://www.django-rest-framework.org/api-guide/serializers/#writable-nested-representations

I am trying to implement multiple nested writable serializers using django rest framework. I have read the docs available http://www.django-rest-framework.org/api-guide/serializers/#writable-nested-representations

我已经可以对一个级别的嵌套执行此操作,但是当有多个嵌套时会有问题.例如,我有以下3个序列化器:

I have been able to do this for one level nests but have a problem when there are multiple nests. For example, I have these 3 serializers:

class FarmerSerializer(serializers.ModelSerializer):
    dob = serializers.DateField(write_only=True)
    gender = serializers.CharField(write_only=True)

    farms = FarmSerializer(required=False, many=True)

    class Meta:
        ...

    def create(self, validated_data):
        # check if nested objects were provided, in particular farms
        farms = validated_data.pop('farms', None)

        farmer = Farmer(**validated_data)
        farmer.added_by_id = validated_data.get('added_by_id')
        farmer.save()

        if farms is not None:
            for farm in farms:
                new_farm = Farm.objects.create(farmer=farmer, added_by=farmer.added_by, **farm)

                # check for blocks -- fails
                blocks = farm.pop('farm_blocks', None)
                if blocks is not None:
                    for block in blocks:
                        FarmBlock.objects.create(farm=new_farm, added_by=farmer.added_by, **block)

        return farmer

class FarmSerializer(serializers.ModelSerializer):
    county = CountySerializer(read_only=True)
    county_id = serializers.UUIDField(write_only=True)

    farm_blocks = FarmBlockSerializer(required=False, many=True)

class FarmBlockSerializer(serializers.ModelSerializer):
    ...

我希望能够发布嵌套的JSON并保存所有3个级别,即农民,农场和农场块.当我保存前两个级别(即农夫和相关农场)时,当前可用.如果有帮助,这是我尝试保存的JSON结构:

I'd like to be able to post JSON that is nested and save all 3 levels i.e farmer, farms and farm blocks. It currently works when I'm saving the first 2 levels i.e Farmer and associated farms. If it helps, here is the JSON structure I'm attempting to save:

[
    {
        "name": "Ashley King",
        "phone_number": "0765124764",
        "gender": "F",
        "dob": "1980-11-26",
        "national_id": "29719008",
        "farms": [
            {
                "name": "Big Farm 3",
                "farm_size": "18",
                "county_id": "5e208ba8-5f6c-4dac-a946-dada0c5250a2",
                "constituency": "Nakuru",
                "ward": "Town",
                "town": "Nakuru",
                "contact_name": "Winnie W.",
                "contact_phone_number": "0724301432",
                "farm_blocks": [
                    {"block_size": 4.56}
                ]
            },
            {
                "name": "Big Farm 4",
                "farm_size": "9.6",
                "county_id": "5e208ba8-5f6c-4dac-a946-dada0c5250a2",
                "constituency": "Nakuru",
                "ward": "Town",
                "town": "Nakuru",
                "contact_name": "Winnie W.",
                "contact_phone_number": "0724301432"
            }
        ]
    },
    {
        "name": "Dennis Wainaina",
        "phone_number": "0764578389",
        "gender": "M",
        "dob": "1988-11-26",
        "national_id": "27675654",
        "farms": [
            {
                "name": "Big Farm 6",
                "farm_size": "18",
                "county_id": "5e208ba8-5f6c-4dac-a946-dada0c5250a2",
                "constituency": "Nakuru",
                "ward": "Town",
                "town": "Nakuru",
                "contact_name": "Winnie W.",
                "contact_phone_number": "0724301432"
            },
            {
                "name": "Big Farm 5",
                "farm_size": "9.6",
                "county_id": "5e208ba8-5f6c-4dac-a946-dada0c5250a2",
                "constituency": "Nakuru",
                "ward": "Town",
                "town": "Nakuru",
                "contact_name": "Winnie W.",
                "contact_phone_number": "0724301432"
            }
        ]
    }
]

推荐答案

也许您可以编辑 create 方法,就像这样,

Maybe you could edit your create method, somewhat like this,

def create(self, validated_data):
    farms = validated_data.pop('farms', None)
    farmer = Farmer.objects.create(**validated_data)

    if farms is not None:
        for farm in farms:
            #pop farm_blocks before creating new_farm
            blocks = farm.pop('farm_blocks', None)
            new_farm = Farm.objects.create(farmer=farmer, added_by=farmer.added_by, **farm)
            #then create farm_bocks
            if blocks is not None:
                for block in blocks:
                    FarmBlock.objects.create(farm=new_farm, added_by=farmer.added_by, **block)               

    return farmer

这篇关于Django Rest Framework多个嵌套的可写序列化器的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆