Django-Rest框架:根据从ModelViewSet接收到的任意数据更新ModelSerializer中的对象,以寻找更好的解决方案

2024-04-18 22:42:05 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个定义如下的ModelViewSet:

class PurchaseOrderApproverViewSet(viewsets.ModelViewSet):
    queryset = PurchaseOrderApprover.objects.all()

    @list_route(methods=['POST'])
    def approve_purchase_order(self, request):
        purchase_order = request.data['purchase_order']
        approver = request.data['approver']
        purchase_order_approver = 
        PurchaseOrderApprover.objects.filter(approver=approver, 
        purchase_order=purchase_order).first()
        if purchase_order_approver:
            serializer = PurchaseOrderApproverSerializer()
            serializer.approve(purchase_order_approver)
            content = {'success'}
            return Response(content, status=status.HTTP_200_OK)
        else:
            raise Http404

相应的ModelSerializer是:

^{pr2}$

假设request.data将包含一个json负载:{"purchase_order": 1, "approver": 1},根据这两个属性,我可以找到相应的采购订单审批人,然后,我想通过PurchaseOrderApproverSerializer中定义的方法is_approved更新为{}。在

模型定义如下:

^{3}$

因为序列化程序只能接收已在序列化程序中定义的数据,因此,我必须先通过视图集中的筛选器找到对象,然后启动序列化程序调用序列化程序中定义的函数来更新对象。但我很肯定DRF提供了一种更好(或更简单)的方法。在

我正在寻找一些东西,如自定义的viewset方法或重写序列化程序中的update方法来实现此目的。在


Tags: 方法程序data序列化objects定义requestorder
1条回答
网友
1楼 · 发布于 2024-04-18 22:42:05

也许,在序列化程序方法approve()内,您可以使用序列化程序的上下文,然后就可以访问请求。基于此,您应该得到request.data。在

在序列化程序方法内部:

request = self.context.get('request')

# In cases of your data came as a GET params 
print(request.query_params)
# Normal post/patch/put method request data
print(request.data)

相关问题 更多 >