django rest框架和多个路由器

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()