gpt4 book ai didi

django - 在DRF中嵌套ViewSet路线

转载 作者:行者123 更新时间:2023-12-04 08:22:07 24 4
gpt4 key购买 nike

我已经创建了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

我的路由器/网址配置看起来像这样
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"}))添加到我的urlpatterns中(它可以工作,但对ViewSet有点中性,而且无论如何通常都是手动的):
  • 具有专用于DefaultRouter View 集的some_view,然后将其安装在url(r'^api/some_view/')上-再次变得笨拙而又花哨,与大量路线有关

  • 是否有“正确”的方式来完成我要完成的工作,还是应该为该问题寻求其他解决方案(即过滤器之类的东西)?

    我见过像 https://github.com/alanjds/drf-nested-routers这样的库,但是对于我的需求(相当简单)而言,这似乎有点过头了。

    最佳答案

    使用列表路由定义您的管理员 View 集。这些参数将允许您执行具有指定权限(已验证并具有管理员权限)的get请求,以扩展该类。即/someview/adminsomeotherview/admin

    from rest_framework.decorators import list_route
    class AdminViewSet(viewset.Viewsets):

    @list_route(methods=['get'],
    permissions=[permissions.IsAuthenticated, HasAdminPermission],
    url_path='admin'
    )
    def admin(self, request):
    # All your custom logic in regards to querysets and serializing
    return serialized.data

    然后,您可以扩展需要管理员操作路线的任何 View 集。
    class SomeBaseViewSet(viewsets.ReadOnlyModelViewSet, AdminViewset):
    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

    您需要注意这一点,因为通常在基本路径之后的参数(即/someview/{param}/)保留给ID引用。确保您的ID引用不会与您的详细路线冲突。

    关于django - 在DRF中嵌套ViewSet路线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40455229/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com