Skip to main content
 首页 » 编程设计

python之Django REST 框架 : update() based on query string parameter

2025年05月04日32虾米姐

是否可以修改 ViewSet 的 update() 函数以根据查询字符串参数而不是 URL 资源名称或请求主体进行更新?

例如,我想触发这样的事情:

payload = {'field' : '2'} 
r = requests.put("http://127.0.0.1:9876/job-defs?job-def-id=2", data=payload) 

并在 job-def-id = 2 时更新我的​​字段。

我目前的情况是这样的:

class JobDefinitionsViewSet(mixins.ListModelMixin, 
                        mixins.CreateModelMixin, 
                        mixins.UpdateModelMixin, 
                        mixins.DestroyModelMixin, 
                        viewsets.GenericViewSet): 
 
    serializer_class = JobDefinitionsSerializer 
 
    def update(self, request, pk=None): 
        job_def_id = self.request.query_params.get('job-def-id', None) 
        super(JobDefinitionsViewSet, self).update(self, request, pk=job_def_id) 
 
    ... 
    # other unrelated code 
    ... 

我不太确定如何继续。 我想尽可能多地重用 mixins.UpdateModelMixin 中的 update() 函数。 感谢您的帮助。

请您参考如下方法:

假设你想使用相同的 url 来列出和检索实体的详细信息,区分 url 参数 job-def-id 的存在,这是一个疯狂的想法:

class JobDefinitionsAllInOneView(mixins.UpdateModelMixin, 
                                 mixins.DestroyModelMixin, 
                                 mixins.ListModelMixin, 
                                 mixins.CreateModelMixin, 
                                 generics.GenericAPIView): 
 
    queryset = JobDefinitions.objects.all() 
    serializer_class = JobDefinitionsSerializer 
 
    def get_object(self): 
        job_def_id = self.request.query_params.get('job-def-id', None) 
        if job_def_id is not None: 
            self.kwargs['pk'] = job_def_id 
        return super(JobDefinitionsAllInOneView, self).get_object() 
 
    def put(self, request, *args, **kwargs): 
        return self.update(request, *args, **kwargs) 
 
    def get(self, request, *args, **kwargs): 
        job_def_id = self.request.query_params.get('job-def-id', None) 
        if job_def_id is not None: 
            # return the details 
            return self.retrieve(request, *args, **kwargs) 
        else: 
            # return a list 
            return self.list(request, *args, **kwargs) 
 
    def post(self, request, *args, **kwargs): 
        return self.create(request, *args, **kwargs) 
 
    def patch(self, request, *args, **kwargs): 
        return self.partial_update(self, request, *args, **kwargs) 
    def delete(self, request, *args, **kwargs): 
        return self.destroy(self, request, *args, **kwargs) 

我还没试过。我看了一下源代码 here对于 get_object 和 here对于混合