2015-11-01 98 views
1

我有一個應用程序與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。

回答

1

好吧,我想通了。 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()