DRF测试问题:通过ID获取单条数据时触发NoReverseMatch错误
DRF接口测试路由反转错误修复方案
在使用Django REST Framework(DRF)进行接口测试时,尝试通过ID获取Zone模型单条数据时触发NoReverseMatch路由反转错误。
问题代码与错误信息
Urls.py
router = routers.DefaultRouter() router.register('zone', views.ZoneViewSet, basename='zone') app_name = 'address' urlpatterns = [ path('', include(router.urls)), ]
Test.py
RECIPES_URL = reverse('address:zone-list') def details_url(id): print(RECIPES_URL, id) return reverse(RECIPES_URL.strip(), args=[id]) # 打印输出 -> /api/address/zone/ 1 def test_zone_details(self): task = sample_payload() url = details_url(task.id) res = self.client.get(url) self.assertEqual(res.status_code, status.HTTP_200_OK)
错误信息
ERROR: test_zone_details (address.tests.ZoneApiTestCase) raise NoReverseMatch(msg) django.urls.exceptions.NoReverseMatch: Reverse for '/api/address/zone/' not found. '/api/address/zone/' is not a valid view function or pattern name.
问题根源
details_url函数中错误地将URL路径字符串传给了reverse()方法,而reverse()的正确参数是路由的视图名称(pattern name),而非具体的URL路径,因此无法匹配到对应的路由规则。
修复方案
DRF的DefaultRouter注册ViewSet后,会自动生成两个标准路由名称:
{basename}-list:对应列表查询接口{basename}-detail:对应单条数据详情接口
修改details_url函数,使用正确的视图名称反转路由:
def details_url(id): return reverse('address:zone-detail', args=[id])
也可以直接在测试方法内生成URL,简化代码:
def test_zone_details(self): task = sample_payload() url = reverse('address:zone-detail', args=[task.id]) res = self.client.get(url) self.assertEqual(res.status_code, status.HTTP_200_OK)
验证效果
修复后,reverse('address:zone-detail', args=[id])会正确生成对应ID的详情接口URL(如/api/address/zone/1/),测试请求可正常命中接口并返回200状态码。
内容的提问来源于stack exchange,提问作者Shiva Giri
相关产品推荐
相关产品推荐

