【问题标题】:Create corresponding models on ViewSet save在 ViewSet 上创建对应的模型保存
【发布时间】:2019-04-16 12:48:25
【问题描述】:

我有一个序列化和创建的简单模型。视图集如下:

class OrderViewset(viewsets.ModelViewSet):

    depth = 1
    serializer_class = OrderSerializer

    ...

    def perform_create(self, serializer):
        serializer.save(user=self.request.user)
        populate_ing(serializer)

一旦用户保存并创建模型,我的目标是拍摄并调用“populate_ing(xxx)”,它采用模型(在本例中为订单)并使用外键关系创建许多相关对象。

是否可以在保存时处理此问题?相信,如上所述,通过覆盖 perform_create 我应该这样做。而且,最重要的是,如何访问刚刚创建的模型?

为了更明确地说明我的目标,我希望做到以下几点:

  1. 使用上面的 ViewSet 创建“订单”
  2. 将“订单”(或其 id 等,视情况而定)传递给函数 populate_ing
  3. populate_ing 发挥作用并创建其他模型
  4. 返回“订单”

我的序列化器如下:

class OrderSerializer(serializers.ModelSerializer):
    class Meta:
        model = Order
        fields = '__all__'

在带有表单的普通 Djnago 视图中,我会对其进行处理,效果如下:

def view_create_order(request):

    form = OrderForm(request.POST or None)

    if form.is_valid():

        new_order = form.save()

        populate_ing(new_order)

    context = {"form": form}
    template = "order/order-update.html"
    return render(request, template, context)

【问题讨论】:

  • 你想在创建过程中调用populate_ing()函数only
  • 希望先创建对象,然后将其传递给 populate_ing()
  • 那么,populate_ing() 函数的参数是什么?
  • 基本上上面应该创建一个“订单”,我想将该订单传递给函数
  • 那么,Model 类,对吧?

标签: python django serialization django-models django-rest-framework


【解决方案1】:

创建的实例将在 instance 属性中可用,因此可以将其传递给 populate_ing() 函数,

class OrderViewset(viewsets.ModelViewSet):

    # depth = 1
    serializer_class = OrderSerializer

    ...

    def perform_create(self, serializer):
        serializer.save(user=self.request.user)
        populate_ing(serializer.instance)

【讨论】:

    猜你喜欢
    • 2018-10-13
    • 2021-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-03
    • 2019-03-10
    • 1970-01-01
    相关资源
    最近更新 更多