python - Django REST 框架 : Flatten nested JSON to many objects

标签 python json django django-rest-framework deserialization

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

模型.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 个不同的子对象。

我设法为一个 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')

但是当一个parent有多个child时,我不知道如何保存多个child。

我试过这样改:

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

问题是您没有Parent 模型。这就是为什么我不知道在 create() 方法中返回什么。根据您的情况,更改 return child 行。

希望对您有所帮助!

关于python - Django REST 框架 : Flatten nested JSON to many objects,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45738663/

相关文章:

json - Ember 数据的 JSON 格式不正确

javascript - Tablesorter 仅按降序对习惯解析的数字进行正确排序,升序是错误的

python - 在 python basemap 中填充国家

python - python客户端boto请求的远程签名

python内置整数对象

python - 无法使用 Python 的 vs code '' 更好的注释扩展''

javascript - 如何从jsondata中获取key的值

c# - 嵌套的Json反序列化c#

python - 设置或更改类的属性时如何在 Django 中设置时间戳

django - Django中的用户创建表单