那么,在第二个示例中,您发送url_path='arguments/(?P<thing>[^/]+)'
。 Django REST 框架use it https://github.com/tomchristie/django-rest-framework/blob/5688d8b73648c67fbe5ea003916dae04a7c5bba0/rest_framework/routers.py#L168创建一个URL pattern
and a URL Name
. But 实施 https://github.com/tomchristie/django-rest-framework/blob/5688d8b73648c67fbe5ea003916dae04a7c5bba0/rest_framework/routers.py#L35太纯粹,无法删除正则表达式。
使用自定义路由器的解决方案
#inside urls.py
router = SimpleRouter()
router.routes.append(
Route(
url=r'^{prefix}/arguments/(?P<thing>[^/]+)$',
name='{basename}-arguments',
mapping={
'get': 'arguments',
},
initkwargs={}
),
)
router.register('extraroute', ExtraRouteViewset, base_name='extraroute')
urlpatterns = router.urls
然后在views.py中删除@list_route
装饰器,因为不再需要它(并且会导致路线冲突)
#inside views.py
class ExtraRouteViewset(viewsets.GenericViewSet):
#...
def arguments(self, request, thing):
return Response({
'key': thing,
'reverse': reverse('extraroute-arguments', kwargs={'thing': 'something'}),
})
我不得不提的是,这实际上添加了一个硬编码Route
默认内的模式SimpleRouter
(具有列表、创建、检索、更新、部分更新、销毁模式)。这意味着every通过此路由器实例注册的视图集将能够实现arguments
方法,当正则表达式匹配它时,将调用该方法。