在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
相关产品推荐
相关产品推荐

