Django остальные рамки, создать модель из массива других моделей - PullRequest
0 голосов
/ 19 декабря 2018

В моем приложении у меня есть следующие модели: Продукты, Заказы и Заказы

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

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

Как мне сделать что-то подобное в 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,
       ...
    ]
}

Ответы [ 2 ]

0 голосов
/ 19 декабря 2018

Если у вас такие сложные отношения, вам всегда нужно переопределить метод 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

0 голосов
/ 19 декабря 2018

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

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

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

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

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

ewogICAgICAgICAgICJuYW1lIiA6ICJEb3VnaG51dCIsCiAgICAgICAgICAgInByaWNlIiA6ICIxLjUwIgogICAgICAgIH0=

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...