如何将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,它正在按预期工作!)到路由器,所以它在概述页面中!
所以:它按原样运行,但我必须手动输入网址,它不在API的概述页面中。
答案 0 :(得分:4)
原因是ViewSet
类与路由器配合使用的是GenericViewSet
,其基数为ViewSetMixin
。
ViewSetMixin
覆盖as_view()
方法,以便actions
关键字执行HTTP方法绑定到资源上的操作,路由器可以为操作方法构建映射。
您可以通过简单地在类库中添加mixin来解决它:
from rest_framework.viewsets import ViewSetMixin
class CarList(ViewSetMixin, generics.ListCreateAPIView)
....
但目前尚不清楚解决方案,因为ListCreateAPIView
和ModelViewSet
它只是一个基类中有一堆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
注意相同的mixins ListModelMixin
和CreateModelMixin
只有GenericViewSet
和GenericAPIView
的区别。
GenericAPIView
使用方法名称并在其中调用操作。 GenericViewSet
改为使用操作并将其映射到方法
这里的ViewSet
包含您需要的方法:
class ListCreateViewSet(mixins.ListModelMixin,
mixins.CreateModelMixin,
GenericViewSet):
queryset_class = ..
serializer_class = ..
现在它可以与路由器配合使用,如果您需要特殊行为,可以覆盖list
和create
方法。