如何使用序列化程序从Django rest中的另一个序列化程序保存对象?

时间:2019-02-02 04:16:51

标签: django-rest-framework serializer

我有两个模型,一个是父模型,另一个是模型

class Parent(models.Model):
    #fields

class ParentItems(models.Model):
    parentId = #parentId
    #fields

,并要创建方法 POST parent/,其中包含ParentItems,例如

{
    "parentField": "value",
    "parentItems": [
        {
            "parentItemsField": "value"
        }
    ]
}

因此,我先使用Parent创建ModelViewSet视图,然后使用序列化程序:

class ParentItemSerializer(serializers.ModelSerializer):
    #serializer

class ParentSerializer(serializers.ModelSerializer):
    parentItems = ParentItemSerializer(many=True, required=True, write_only=True)

    def _createParentItems(self, parentItem, parent):
        for item in parentItem:
            item['parent'] = parent.id
            parentItemSerializer = ParentItemSerializer(data=item)
            if parentItemSerializer.is_valid(raise_exception=True):
                itemSerializer.save()

    def create(self, validated_data):
        with transaction.atomic():
            parentItems = validated_data.pop('parentItems')
            createdData = super(ParentSerializer, self).create(validated_data)
            # create the parent item
            self._createParentItems(parentItems, createdData)
            return createdData

我在parentItems方法内的ParentSerializer中添加create字段,弹出parentItems并将其传递到_createParentItems中以创建项目。

但是这不起作用,parentItems已经是一个对象。当我致电parentItemSerializer.is_valid(raise_exception=True)时出错。

如何在django rest中从另一个序列化器保存对象? 我应该使用另一个序列化器字段吗?

使用OrderedDict尝试过,它不起作用,也没有将项目传递给validated_data

1 个答案:

答案 0 :(得分:0)

首先像下面的代码一样更改模型。然后,您可以使用我为您编写的序列化程序。

class Parent(models.Model):
    #fields

class ParentItem(models.Model):
    parent = models.ForeignKey(Parent, on_delete=models.CASCADE)
    # other fields


class ParentItemSerializer(ModelSerializer):
    class Meta:
        model = ParentItem
        fields = ('field1', ...)

    def create(self, validated_data):
        ParentItem.objects.create(field1=validated_data['field2'],...)
        return validated_data


class Parent(ModelSerializer):

    parentItems = ParentIremSerializer(many=True)

    class Meta:
        model=Parent
        fields = ('parentItems', 'other fields',...)

    def create(self, validated_data):
        parent = Parent('field1'=validated_data['field1'])
        parent.save()

        parentItemsList = validate_data.pop('parentItems')
        parentItemSer = ParentItemSerialzer(data=parentItemsList,many=True)

        if parentItemSer.is_valid():
            parentItemSer.save()

       return validated_data