我創建2個ModelViewSets像這樣(簡化演示):在DRF嵌套視圖集中路線
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,那麼最好的方法是什麼?
事情我已經嘗試:
@list_route
上SomeBaseViewSet
,但不能找出「正確」的方式將其連接到我的AdminViewSet
- 添加
url(r'^api/some_view/admin$', AdminViewSet.as_view({"get": "list"}))
到我的URL模式(這八九不離十工作,但neuters的ViewSet有點,而且通常真的是手動的): - 爲
some_view
的視圖設置了專用的DefaultRouter
,然後我在url(r'^api/some_view/')
上掛載 - 再次哈克和迂腐處理大量路線
有沒有一種「正確」的方式來做我想要完成的事情,或者我應該爲這個問題找到一個不同的解決方案。過濾器或其他)?
我見過像https://github.com/alanjds/drf-nested-routers這樣的圖書館,但對我的(相當簡單的)需求來說,這看起來像是過度殺傷性的。
我覺得你濫用as_view。在他們的文檔as_view似乎是一個URL配置功能。此外,如果您決定將管理操作擴展到更多視圖,則必須編寫更多代碼。我將發佈我的建議解決方案 – Dap
我想'as_view'的評估應該移出'admin'列表路線,否則對我來說這似乎不是一個壞主意。 – dhill