Django rest框架,从其他模型数组创建模型

时间:2018-12-19 08:01:46

标签: python rest django-rest-framework

在我的应用中,我具有以下模型:产品,订单和订单条目

订单由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,
       ...
    ]
}

2 个答案:

答案 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服务的相当普遍的技术。

有用的参考文献: