You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 15:15:40