Django url方法匹配单引号包裹逗号分隔字符串的NoReverseMatch问题
问题原因
你原来的路由正则硬编码了固定字符串"'1,2'"作为匹配规则,仅能匹配路径中完全符合该固定值的参数,同时正则额外包裹了双引号,反向解析时传入的player_ids值为不带引号的1,2,和匹配规则完全不匹配,因此抛出NoReverseMatch错误。
正确实现方案
1. 路由配置
匹配不带单引号的逗号分隔数字串(推荐,更符合URL设计规范)
如果不需要在URL中携带单引号,直接匹配1,2,3,4这类格式,使用如下路由:
# Django 1.x/2.x 导入url from django.conf.urls import url # Django 3.x+ 推荐用re_path,导入方式如下 # from django.urls import re_path url(r'^path/to/api/end_point/(?P<player_ids>\d+(?:,\d+)*)/', PlayerResultsView.as_view(), name='get_players')
正则说明:\d+匹配1个及以上数字,(?:,\d+)*为非捕获组,匹配0次及以上「逗号+数字」的组合,可适配任意长度的逗号分隔数字串。
反向解析示例:
reverse('get_players', kwargs={'player_ids': '1,2,3,4'})
匹配单引号包裹的逗号分隔数字串
如果确实需要匹配'1,2,3,4'这类带单引号的参数,路由调整为:
url(r"^path/to/api/end_point/(?P<player_ids>'\d+(?:,\d+)*')/", PlayerResultsView.as_view(), name='get_players')
反向解析示例(注意参数要带单引号):
reverse('get_players', kwargs={'player_ids': "'1,2,3,4'"})
2. 视图参数处理
在视图中拿到参数后,按需求处理即可,示例代码:
from rest_framework.views import APIView from rest_framework.response import Response class PlayerResultsView(APIView): def get(self, request, player_ids, *args, **kwargs): # 若参数带单引号,先去除 player_ids = player_ids.strip("'") # 拆分转换为数字列表 id_list = [int(pk) for pk in player_ids.split(',') if pk.isdigit()] # 后续业务逻辑 return Response({'matched_player_ids': id_list})
注意事项
- 如果ID支持非数字字符,可将正则中的
\d替换为[^,'],即可匹配任意不含逗号、单引号的ID值。 - 高版本Django中
url方法已被标记为废弃,替换为re_path使用即可,参数规则完全一致。
内容的提问来源于stack exchange,提问作者Night Rider
相关产品推荐
相关产品推荐

