You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在Django REST Framework中实现PATCH请求遇参数缺失问题求助

解决Django ModelViewSet中PATCH请求报错的问题

错误原因

你自定义的patch方法参数使用了id,但DRF的ModelViewSet详情路由默认采用pk作为主键参数名,导致路由传递的参数无法匹配方法的id参数,从而抛出missing 1 required positional argument: 'id'错误。另外,ModelViewSet已经内置了处理PATCH部分更新的partial_update方法,无需自行重写patch方法。

正确实现方式

方式一:重写内置的partial_update方法(推荐)

直接复用DRF的默认更新逻辑,仅添加自定义操作(比如打印主键):

class CompanyViewSet(viewsets.ModelViewSet):
    serializer_class = s.CompanySerializer   
    queryset = m.Company.objects.all()
    
    def partial_update(self, request, *args, **kwargs):
        # 从kwargs中获取主键pk
        pk = kwargs.get('pk')
        print(pk)
        # 调用父类的partial_update完成默认更新逻辑
        return super().partial_update(request, *args, **kwargs)

方式二:自定义patch方法(不推荐,需手动实现更新逻辑)

如果一定要自定义patch方法,需将参数改为pk,并手动实现更新流程:

from rest_framework.response import Response

class CompanyViewSet(viewsets.ModelViewSet):
    serializer_class = s.CompanySerializer   
    queryset = m.Company.objects.all()
    
    def patch(self, request, pk=None, format=None):
        print(pk)
        # 获取要更新的实例
        instance = self.get_object()
        # 使用partial=True允许部分字段更新
        serializer = self.get_serializer(instance, data=request.data, partial=True)
        serializer.is_valid(raise_exception=True)
        serializer.save()
        return Response(serializer.data)

正确的PATCH请求方式

  • URL指定主键:请求URL应为详情路由,比如/companies/1/(具体路径取决于你的路由配置),主键通过URL传递,无需在请求体中包含id字段。
  • 请求体仅传需修改的字段:比如你要修改name字段,请求体只需传:
{
    "name": "新公司名称"
}

内容的提问来源于stack exchange,提问作者whitebear

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 02:05:24