Как сохранить объект с использованием сериализатора из другого сериализатора в django rest? - PullRequest
0 голосов
/ 02 февраля 2019

У меня есть две модели, родитель и его элементы

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 голосов
/ 02 февраля 2019

Сначала измените модель, как показано ниже.Тогда вы можете использовать сериализатор, как я написал для вас.

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
...