我创建了两个ModelViewSets,如下所示(为演示简化):
class SomeBaseViewSet(viewsets.ReadOnlyModelViewSet):
serializer_class = SomeEventSerializer
permission_classes = (permissions.IsAuthenticated,)
def get_queryset(self):
return SomeObjects.objects.filter(owner=self.request.user)
def get_serializer_context(self):
context = super(SomeBaseViewSet, self).get_serializer_context()
context.update({
"user": self.request.user,
"some_context_key": False
})
return context
class AdminViewSet(SomeBaseViewSet):
# Added in the HasAdminPermission
permission_classes = (permissions.IsAuthenticated, HasAdminPermission)
# Different queryset filter (overriding `get_queryset` vs setting queryset for standardization)
def get_queryset(self):
return SomeObjects.objects.all()
# The context should have `some_context_key=True`, and `user=request.user`
def get_serializer_context(self):
context = super(AdminViewSet, self).get_serializer_context()
context.update({
"some_context_key": True
})
return context
我的路由器/URL配置如下
router = DefaultRouter()
router.register(r'some_view', SomeBaseViewSet, base_name="some_view")
urlpatterns += [
url(r'^api/', include(router.urls)),
]
如果我想将
/api/some_view/admin
路由到AdminViewSet,最好的方法是什么?我尝试过以下几种方法:
- 在SomeBaseViewSet上使用
@list_route
,但无法弄清楚如何将其与我的AdminViewSet
连接起来;
- 将url(r'^api/some_view/admin$', AdminViewSet.as_view({"get": "list"}))
添加到我的urlpatterns中(这样做有点奇怪而且手动),虽然它有点起作用,但是会削弱ViewSet的功能;
- 为some_view
viewset创建一个专门的DefaultRouter
,然后将其挂载在url(r'^api/some_view/')
上,但这也是一种繁琐的方式,如果路由数量很大,就不太实用了。是否有“正确”的方法来完成我想要实现的目标,或者我应该寻找解决此问题的其他方法(例如筛选器)?
我看到过像https://github.com/alanjds/drf-nested-routers这样的库,但对于我的(相当简单的)需求来说似乎有些过度设计。