首页 > 解决方案 > Django rest框架,从其他模型数组创建模型

问题描述

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

订单由 OrderEntries 组成,OrderEntries 代表购物车中的每一行,由产品和金额组成。

现在,我想用我的 rest api 做的是通过将 OrderEntries 数组发布到 /api/orders 来创建 Order 对象的能力,这将验证该数组,然后创建新的 OrderEntries 和最终的 Order 对象。

我将如何在休息框架中做这样的事情?

编辑:我的序列化程序现在的样子:

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

标签: pythonrestdjango-rest-framework

解决方案


当您有如此复杂的关系时,您总是必须重写序列化程序的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


推荐阅读