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

