【问题标题】:Add ListCreateAPIView-class to router将 ListCreateAPIView 类添加到路由器
【发布时间】:2015-04-12 21:13:45
【问题描述】:

如何将 ListCreateAPIView 添加到路由器 url?

通常我喜欢:

router = routers.DefaultRouter()
router.register(r'busses', BusViewSet)

但现在我有:

class CarList(generics.ListCreateAPIView): ...

我现在将它添加到 urlpatterns 中:

urlpatterns = patterns('', 
url(r'^carts/', CarList.as_view(model=Car), name='cars'),

我想将这个 Cars-view(如果我手动调用 url,它会按预期工作!)添加到路由器,所以它在概览页面中!

所以:它按原样工作,但我必须手动输入 url,它不在 API 的概述页面中。

【问题讨论】:

  • 您找到解决方案了吗?

标签: django django-rest-framework


【解决方案1】:

原因是 ViewSet 类与路由器一起工作的原因是 GenericViewSet 在基数中有一个 ViewSetMixin
ViewSetMixin 覆盖 as_view() 方法以便它采用 actions将 HTTP 方法绑定到资源和路由器上的操作的关键字可以为操作方法构建映射。
您可以通过在类库中简单地添加该 mixin 来解决它:

from rest_framework.viewsets import ViewSetMixin

class CarList(ViewSetMixin, generics.ListCreateAPIView)
    ....

但这不是一个明确的解决方案,因为ListCreateAPIViewModelViewSet 它只是一个空类,在一个基础中有一堆mixin。因此,您始终可以使用所需的方法构建自己的 ViewSet
比如这里ListCreateAPIView的代码:

class ListCreateAPIView(mixins.ListModelMixin,
                    mixins.CreateModelMixin,
                    GenericAPIView):

    def get(self, request, *args, **kwargs):
        return self.list(request, *args, **kwargs)

    def post(self, request, *args, **kwargs):
        return self.create(request, *args, **kwargs)

这里是ModelViewSet

class ModelViewSet(mixins.CreateModelMixin,
               mixins.RetrieveModelMixin,
               mixins.UpdateModelMixin,
               mixins.DestroyModelMixin,
               mixins.ListModelMixin,
               GenericViewSet):

    pass

注意 ListModelMixinCreateModelMixin 相同的 mixin,GenericViewSetGenericAPIView 之间只有区别。
GenericAPIView 使用方法名称并在其中调用操作。 GenericViewSet 改为使用操作并将它们映射到方法。
这里ViewSet 带有您需要的方法:

class ListCreateViewSet(mixins.ListModelMixin,
                    mixins.CreateModelMixin,
                    GenericViewSet):   

    queryset_class = ..
    serializer_class = ..

现在它将与路由器一起使用,如果您需要特殊行为,您可以覆盖 listcreate 方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-25
    • 1970-01-01
    • 2020-08-09
    • 2015-05-10
    • 2016-01-18
    • 1970-01-01
    相关资源
    最近更新 更多