Django DRF中REST端点无法获取pk参数的问题咨询
问题原因与解决方案
核心问题
你给@action装饰器设置了detail=False,这会让Django REST Framework把这个接口注册为列表级端点(对应整个资源集合,而非单个实例),生成的URL路径是mymodule/my_rest_api/,不包含<pk>占位符。这直接导致两个现象:
- 带
/1019的URL无法匹配路由规则,返回404 - 去掉
/1019后能进入方法,但因为是列表级接口,DRF不会传递pk参数,所以方法里的pk始终是None
修复步骤
如果你的my_rest_api接口需要针对单个实例(用到pk=1019),只需把@action的detail参数改成True:
class MyModuleViewSet(viewsets.ModelViewSet): # ... # 将detail=False修改为detail=True @action(detail=True, permission_classes=(IsOwnerOrReadOnly,)) @debugger_queries def my_rest_api(self, request, pk=None): # ... return HttpResponse(resp, content_type="application/json", status=status.HTTP_200_OK)
修改后,DRF会自动生成包含<pk>的URL路径:mymodule/<pk>/my_rest_api/,此时你原来的URLhttp://0.0.0.0:3000/myproject/api/mymodule/1019/my_rest_api/?format=json¶m1=7945就能正常匹配,pk参数也会被正确赋值为1019。
补充说明
detail=False:对应列表接口,URL不包含pk,视图方法无法获取单个实例的主键detail=True:对应详情接口,URL包含pk,DRF会自动从URL中提取主键并传递给视图方法
内容的提问来源于stack exchange,提问作者MsA
相关产品推荐
相关产品推荐

