Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django REST框架:将嵌套JSON展平到多个对象_Python_Json_Django_Django Rest Framework_Deserialization - Fatal编程技术网

Python Django REST框架:将嵌套JSON展平到多个对象

Python Django REST框架:将嵌套JSON展平到多个对象,python,json,django,django-rest-framework,deserialization,Python,Json,Django,Django Rest Framework,Deserialization,我有一个包含父字段的子模型,我从一个API(我无法控制它的格式)获取一个JSON models.py: class ChildModel(models.Model): name = models.CharField(max_length=100) age = models.IntegerField() parent = models.CharField(max_length=100) API.json: { "parent_name":'Homer', "c

我有一个包含父字段的子模型,我从一个API(我无法控制它的格式)获取一个JSON

models.py:

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

{
   "parent_name":'Homer',
   "children":[
      {
         "name":'Bart',
         "age":20
      },
      {
         "name":'Lisa',
         "age":15
      },
      {
         "name":'Maggie',
         "age":3
      }
   ]
}
我正在尝试编写一个序列化程序,它将获得这个JSON并创建3个不同的子对象

我设法为一个孩子这样做:

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')
但是当一个父母有多个孩子时,我不知道如何保存多个孩子

我试着这样改变它:

children = ChildSerializer(source='*', many=True)
OrderedDict([(u'parent_name', u'Homer'), (u'name', u'age')])
但经过验证的数据如下所示:

children = ChildSerializer(source='*', many=True)
OrderedDict([(u'parent_name', u'Homer'), (u'name', u'age')])

有什么建议吗?

您需要自定义序列化程序,以便它创建所有子项。为此,使用了
create()
方法

试试这个:

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
问题是您没有父级模型。这就是为什么我不知道在
create()
方法中返回什么。根据您的情况,更改该
返回子项


希望有帮助

可能重复:F.y.i.
child
的复数形式是
children
。在某些情况下,儿童可能不需要自己的
模型
。drf支持。不知道这是否有帮助。@demux谢谢你的英语课,我更新了帖子。在我的例子中,我确实需要一个子模型(因为我甚至没有父模型),所以ArrayField不是一个选项。