在我的应用中,我具有以下模型:产品,订单和订单条目
订单由OrderEntries构成,OrderEntries代表购物车中的每一行,并由Product和金额构成。
现在,我要使用我的其余api的功能是通过将OrderEntries数组发布到/ api / orders来创建Order对象的能力,这将验证该数组,然后创建新的OrderEntries和最终的Order对象。 / p>
我如何在休息框架中做类似的事情?
编辑:我的序列化器现在的样子:
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,
...
]
}
答案 0 :(得分:1)
当您拥有如此复杂的关系时,您始终必须重写序列化程序的create
方法并注意创建对象。结帐DRF Writable Nested Serializers。
您的情况下,一种简单的解决方案可以采用以下形式:
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
的{{1}}
答案 1 :(得分:0)
您可以尝试将订单json对象作为Base64
字符串传递。
例如,
假设您的订单如下所示:
{
"name" : "Doughnut",
"price" : "1.50"
}
Base64
的编码版本类似于:
ewogICAgICAgICAgICJuYW1lIiA6ICJEb3VnaG51dCIsCiAgICAgICAgICAgInByaWNlIiA6ICIxLjUwIgogICAgICAgIH0=
现在,您可以对此进行解码并检索订单详细信息。
Base64
编码是用于构建Web服务的相当普遍的技术。
有用的参考文献: