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

Django REST Framework从URL获取pk报错:get()参数pk重复,如何解决?

解决Django REST Framework中get() got multiple values for argument 'pk'错误

这个错误的根源在于你对APIView视图方法的参数定义顺序出现了问题,咱们一步步拆解解决:

问题原因

Django REST Framework的APIView类中,所有视图方法(比如get/post)的第一个参数必须是request对象。你之前的get方法定义成了def get(self,pk),缺少了request这个必要参数:

  • 当URL配置path('grn-barcodes/<int:pk>/', GrnBarcodes.as_view())匹配请求时,Django会把解析到的pk作为位置参数传递给视图方法。
  • 但因为你的方法没有把request放在第一个参数位,Django会把request对象错误地赋值给pk参数,随后又把URL中的pk值传递给下一个参数,导致pk被传入了两个值,最终触发get() got multiple values for argument 'pk'的错误。

两种正确的实现方式

方式1:直接在方法参数中接收pk

保持URL配置不变,修改视图的get方法,将request作为第一个参数,后续跟上pk:

class GrnBarcodes(APIView):
    permission_classes = (permissions.IsAuthenticated,)
    
    def get(self, request, pk):
        print("pk is", pk)
        # 后续逻辑直接使用pk变量即可
        return Response("done")

方式2:从self.kwargs中获取pk

如果不想在方法参数里声明pk,可以仅保留request参数,从self.kwargs字典中取出URL捕获的pk值:

class GrnBarcodes(APIView):
    permission_classes = (permissions.IsAuthenticated,)
    
    def get(self, request):
        pk = self.kwargs['pk']
        print("pk is", pk)
        # 后续逻辑使用pk变量
        return Response("done")

两种方式都能解决问题,选择哪种取决于你的代码习惯,核心就是要保证APIView的视图方法第一个参数是request对象,避免参数传递冲突。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 14:27:58