简体   繁体   English

Django REST框架:将嵌套的JSON拼接到许多对象

[英]Django REST Framework: Flatten nested JSON to many objects

I have this child model with parent field in it, and I'm getting a JSON from an API (which I can't control its format). 我有这个包含父字段的子模型,我从API(我无法控制其格式)获取JSON。

models.py: models.py:

class ChildModel(models.Model):
    name = models.CharField(max_length=100)
    age = models.IntegerField()
    parent = models.CharField(max_length=100)

API.json: API.json:

{
   "parent_name":'Homer',
   "children":[
      {
         "name":'Bart',
         "age":20
      },
      {
         "name":'Lisa',
         "age":15
      },
      {
         "name":'Maggie',
         "age":3
      }
   ]
}

I'm trying to write a serializer that will get this JSON and will create 3 different child objects. 我正在尝试编写一个将获得此JSON的序列化程序,并将创建3个不同的子对象。

I manage to do this for one child: 我设法为一个孩子做这件事:

class ChildSerializer(serializers.Serializer):
    name = serializers.CharField()
    age = serializers.IntegerField()

class ParentSerializer(serializers.ModelSerializer):
    parent_name = serializers.CharField()
    children = ChildSerializer(source='*')

    class Meta:
        model = ChildModel
        fields = ('parent_name', 'children')

But when there are more than one child for a parent, I don't know how to save multiple children. 但是,如果父母有多个孩子,我不知道如何保存多个孩子。

I tried to change it like this: 我试着像这样改变它:

children = ChildSerializer(source='*', many=True)

But the validated data looks like this: 但验证的数据如下所示:

OrderedDict([(u'parent_name', u'Homer'), (u'name', u'age')])

Any suggestions how to make it possible? 任何建议如何使它成为可能?

You need to customize your serializer so that it creates all the children. 您需要自定义序列化程序,以便创建所有子项。 For that, create() method is used. 为此,使用create()方法。

Try this: 尝试这个:

class ParentSerializer(serializers.Serializer):
    parent_name = serializers.CharField()
    children = ChildSerializer(many=True)

    def create(self, validated_data):
        parent_name = validated_data['parent']

        # Create or update each childe instance
        for child in validated_data['children']:
            child = Child(name=child['name'], age=child['age'], parent=valid, parent=parent_name)
            child.save()

        return child

The problem is that you don't have a Parent model. 问题是你没有Parent模型。 That's why I don't know what to return in the create() method. 这就是为什么我不知道在create()方法中返回什么。 Depending on your case, change that return child line. 根据您的情况,更改return child行。

Hope it helps! 希望能帮助到你!

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM