Django Rest Framework:URL路径参数致get方法报错求助
问题原因与解决办法
核心问题
Django会把URL路径里捕获的参数(比如<int:product>)作为关键字参数传递给视图的请求处理方法(比如get),但你的get方法只定义了request这一个参数,没有接收额外的product参数,导致在调用方法前就触发了TypeError,自然不会执行到断点处。
解决方法
方法1:修改APIView的get方法,添加对应参数
根据URL中定义的参数名,在get方法里增加对应的参数:
class ProductRating(APIView): permission_classes = [permissions.IsAuthenticated] serializer_class = ProductRatingSerializer def get(self, request, product): # 新增product参数,和URL里的<int:product>对应 breakpoint() # 后续可以用product变量获取目标产品ID,比如做查询: # product_obj = Product.objects.get(id=product)
如果URL里改成了<int:pk>或<int:id>,就把方法参数改成pk或id即可。
方法2:使用RetrieveAPIView时指定参数映射
如果用RetrieveAPIView,需要设置lookup_url_kwarg属性,匹配URL中的参数名:
class ProductRating(RetrieveAPIView): permission_classes = [permissions.IsAuthenticated] serializer_class = ProductRatingSerializer queryset = Product.objects.all() lookup_url_kwarg = 'product' # 指定URL里捕获的参数名是product
如果URL参数是<int:pk>,则可以不用设置lookup_url_kwarg,因为RetrieveAPIView默认使用pk作为参数名。
为什么断点没触发?
因为参数不匹配的错误是在Django尝试调用你的get方法之前就抛出的,属于参数传递阶段的错误,代码根本没机会执行到breakpoint()这一行,所以断点不会触发。
内容的提问来源于stack exchange,提问作者crawlingdev
相关产品推荐
相关产品推荐

