Django rest framework, создать модель из массива других моделей

В моем приложении есть следующие модели: Products, Orders и OrderEntries.

Заказы делаются из элементов OrderEntries, которые представляют каждую строку в корзине покупок и состоят из продукта и суммы.

Теперь то, что я хочу сделать с моим rest api, - это возможность создавать объекты Order путем публикации массива OrderEntries в / api / orders, который будет проверять массив, а затем создавать новые OrderEntries и окончательный объект Order.

Как мне сделать что-то подобное в rest-framework?

Обновлено: Как теперь выглядят мои сериализаторы:

class ProductSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = Product
        fields = ('pk', 'name', 'author', 'description', 'imageUrl', 'thumbUrl', 'price')


class OrderEntrySerializer(serializers.PrimaryKeyRelatedField, serializers.ModelSerializer):
    class Meta:
        model = OrderEntry
        fields = ("pk", "product", "amount")


class OrderSerializer(serializers.HyperlinkedModelSerializer):
    entries = OrderEntrySerializer(many=True, queryset=OrderEntry.objects.all())

    class Meta:
        model = Order
        fields = ("pk", "order_state", "entries")

Для этого мне потребуется отправить следующее в / orders:

{
  "order_state": "string",
  "entries": [
    "string"
  ]
}

Я хочу просто опубликовать следующее, поле состояния будет установлено во время создания:

{
   "entries": [
       ProductEntry,
       ...
    ]
}

Вы можете показать то, что пробовали?

JPG 19.12.2018 09:32
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
1
892
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы можете попробовать передать json-объекты вашего заказа в виде строки Base64.

Так, например:

Допустим, ваш заказ выглядит так:

    {
       "name" : "Doughnut",
       "price" : "1.50"
    }

Кодированная версия Base64 будет выглядеть примерно так:

ewogICAgICAgICAgICJuYW1lIiA6ICJEb3VnaG51dCIsCiAgICAgICAgICAgInByaWNlIiA6ICIxLjUwIgogICAgICAgIH0=

Теперь вы можете расшифровать это и получить детали заказа.

Кодирование Base64 - довольно распространенный метод, который используется при создании веб-сервисов.

Полезные ссылки:

Ответ принят как подходящий

Когда у вас есть такие сложные отношения, вам всегда нужно переопределить метод сериализатора create и позаботиться о создании объектов. Касса Вложенные сериализаторы с возможностью записи DRF. Простое решение в вашем случае может быть в таком виде:

class OrderSerializer(serializers.HyperlinkedModelSerializer):
    entries = OrderEntrySerializer(many=True, queryset=OrderEntry.objects.all())

    class Meta:
        model = Order
        fields = ("pk", "order_state", "entries")

    def create(self, validated_data):
        entries = validated_data.pop('entries', None)

        order = super().create(validated_data)

        for entry in entries:
            OrderEntry.objects.create(order=order, **entry)

        return order

Конечно, это очень простое решение, поскольку у меня нет полной информации о ваших моделях и их отношениях, но это должно дать вам представление о том, что нужно сделать. Здесь я предполагаю, что OrderEntry имеет ForeignKey, связанный с Order.

вы правы в своем предположении, что они связаны через ForeignKey, это похоже на то, о чем я думал.

Lett1 19.12.2018 11:34

Хорошо. Вы можете попробовать, и если результат удовлетворительный, не забудьте принять ответ.

Ken4scholars 19.12.2018 11:42

Другие вопросы по теме