Fit*_*lip 8 django django-rest-framework
我已经创建了2个这样的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
Run Code Online (Sandbox Code Playgroud)
我的路由器/ url配置看起来像这样
router = DefaultRouter()
router.register(r'some_view', SomeBaseViewSet, base_name="some_view")
urlpatterns += [
url(r'^api/', include(router.urls)),
]
Run Code Online (Sandbox Code Playgroud)
如果我想要路由/api/some_view/admin到AdminViewSet,那么最好的方法是什么?
我试过的事情:
@list_route在SomeBaseViewSet,但无法弄清楚将它连接到我的"正确"方式AdminViewSeturl(r'^api/some_view/admin$', AdminViewSet.as_view({"get": "list"}))到我的urlpatterns(哪个sorta有效,但是ViewSet稍微有点,并且通常真的是手动的):DefaultRouter用于some_view视图集,我然后登上url(r'^api/some_view/')- 再次hacky和迂腐与大量的路线是否有"正确"的方式来完成我想要完成的任务,或者我应该找到针对此问题的不同解决方案(即过滤器或其他内容)?
我见过像https://github.com/alanjds/drf-nested-routers这样的库,但这对我(相当简单)的需求来说似乎有些过分.
不确定我是否错过了一些东西,但我刚刚测试过,效果很好(顺序很重要):
router = DefaultRouter()
# this will overrides routes from the line below
router.register(r'some_view/admin', AdminViewSet)
router.register(r'some_view', SomeBaseViewSet)
Run Code Online (Sandbox Code Playgroud)
我想我已经找到了自己问题的答案,但我对此设置了 +50 代表赏金,以防有人想插话(也许是@tom-christie?)。
不管怎样,我为我的用例解决这个问题的方法是使用@list_routeand theAdminViewSet函数.as_view()。
像这样的东西就足够了:
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
@list_route()
def admin(self, request):
return AdminViewSet.as_view({"get": "list"})(request)
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
Run Code Online (Sandbox Code Playgroud)
并且将允许人们相应地路由 url(基于函数的名称),并强制执行您需要的任何额外功能。
| 归档时间: |
|
| 查看次数: |
1457 次 |
| 最近记录: |