【问题标题】:Django REST Framework: Flatten nested JSON to many objectsDjango REST Framework:将嵌套的 JSON 展平为许多对象
【发布时间】:2018-01-26 01:53:09
【问题描述】:

我有这个带有父字段的子模型,我从 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')])

有什么建议可以让它成为可能吗?

【问题讨论】:

  • 仅供参考。 child 的复数形式是 children。在某些情况下,孩子们可能不需要自己的Model。 drf 支持django's ArrayField。不知道这是否有帮助。
  • @demux 感谢英语课,我更新了帖子。就我而言,我确实需要一个子模型(因为我什至没有父模型),所以 ArrayField 不是一个选项。

标签: python json django django-rest-framework deserialization


【解决方案1】:

您需要自定义您的序列化程序,以便它创建所有子项。为此,使用了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 行。

希望对你有帮助!

【讨论】:

    猜你喜欢
    • 2016-01-22
    • 2019-01-17
    • 2017-04-09
    • 1970-01-01
    • 2021-10-19
    • 2012-05-29
    • 1970-01-01
    • 2015-09-21
    相关资源
    最近更新 更多