В моем приложении есть следующие модели: 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,
...
]
}






Вы можете попробовать передать 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, это похоже на то, о чем я думал.
Хорошо. Вы можете попробовать, и если результат удовлетворительный, не забудьте принять ответ.
Вы можете показать то, что пробовали?