django rest框架和多个路由器

时间:2015-11-01 15:30:50

标签: django python-3.x django-rest-framework

我有一个使用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。

1 个答案:

答案 0 :(得分:1)

好吧,我明白了。 Django Rest Framework中的SimpleRouter类定义了类中的路由,并且没有绑定__init__阶段中的值。 SimpleRouter.routes 是一个列表()。

由于列表是可变的,因此在创建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()