我有一个使用DRF创建的API的应用程序。在那里我使用DRF路由器来路由URL。我想在列表视图中添加一个带参数的路径(因此@list_route不起作用)到某些视图集,但不能添加到其他视图集。
所以我想定义两个路由器:
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'}),
...
这是为什么???我可能错过了一些基本的东西。如何将Route()添加到某些路由器而不是其他路由器,以便我可以使用他们自己的方法在“user”和“admin”中拆分我的API-urls。
答案 0 :(得分:1)
由于列表是可变的,因此在创建SimpleRouter实例时,SimpleRouter的所有实例都指向相同的 route -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()