Django ModelViewSet自定义@action路由访问返回404错误问题咨询
错误原因排查
@action装饰器的detail参数设置和访问URL不匹配:你当前设置的detail=False代表这是列表级动作,路由规则不会匹配路径中的实例ID(你URL里的UUID参数),路径结构为{根路由}/{动作名},不需要携带pk参数。你访问的两个URL都带了UUID参数,和路由规则完全不匹配,因此触发404。- 额外小问题:装饰器
name参数里的Locaitons为拼写错误(正确为Locations),不影响路由匹配,仅影响接口显示名称,可按需修正。
解决方案
根据你的实际业务需求二选一即可:
情况1:接口不需要对应单个Vesting实例,无需传UUID
- 调整方法定义,删除不必要的
pk参数:
@action(detail=False, methods=['GET'], name='Get Vesting Locations') def get_vesting_locations(self, request, *args, **kwargs): # 此处编写业务逻辑
- 访问正确URL:
http://localhost:8000/vesting/get_vesting_locations/
情况2:接口需要对应单个Vesting实例,必须传UUID参数
- 把
@action的detail参数改为True,声明为实例级动作,路由会自动匹配{根路由}/{实例id}/{动作名}的结构:
@action(detail=True, methods=['GET'], name='Get Vesting Locations') def get_vesting_locations(self, request, pk=None, *args, **kwargs): # 此处编写业务逻辑,可通过pk获取对应实例
- 访问URL:
http://localhost:8000/vesting/617b8bd8-6fdd-43eb-948a-4b17d1a0a089/get_vesting_locations/
内容的提问来源于stack exchange,提问作者Tomer Avraham
相关产品推荐
相关产品推荐

