django rest框架和多个路由器
问题描述:
我有一个应用程序与DRF创建的API。因为我使用DRF路由器来路由URL。我想添加一个路由到列表视图的参数(所以@list_route不会工作)到某些视图集,而不是其他人。django rest框架和多个路由器
,所以我想定义两个路由器:
user_router = routers.SimpleRouter()
admin_router = routers.SimpleRouter()
我想要的路线加入到他们的一个:
search_route = Route(
url='^{prefix}/search/(?P<field>\w+)/(?P<value>\w+){trailing_slash}$',
mapping={
'get': 'search',
},
name='{basename}-search',
initkwargs={}
)
admin_router.routes.append(search_route)
但现在我结束与search_route加入这两个路由器,并因此耦合到我个人在路由器注册的视图集。
ipython> user_router.routes
...
Route(url='^{prefix}/search/(?P<field>\\w+)/(?P<method>\\w+)/(?P<keyword>\\w+){trailing_slash}$', mapping={'get': 'search'}, name='{basename}-search', initkwargs={'suffix': 'Search'}),
...
这是为什么?我可能在这里缺少一些基本的东西。我如何添加一个路由()到某些路由器而不是其他的路由器,这样我就可以用“用户”和“管理员”分别使用他们自己的方法来分割我的API-urls。
答
好吧,我想通了。 Django Rest Framework中的SimpleRouter类定义了类中的路由,并且不会绑定__init__阶段中的值。 SimpleRouter.routes是一个list()。
由于列表是可变的,所以在创建SimpleRouter实例时,SimpleRouter的所有实例指向相同的路由 -list。当我添加一个路由到admin_router.routes时,它也更新了user_router.routes ....
解决这个问题的方法是定义覆盖路由器列表的单独路由器类。
class AdminRouter(SimpleRouter):
routes = [ ... my list of Route()'s ... ]
class UserRouter(SimpleRouter):
routes = [ ... my other list of Route()'s ...]
admin_router = AdminRouter()
user_router = UserRouter()