在Django REST框架API根文档中显示ViewSets和GenericAPIViews



视图:

class FooViewSet(viewsets.ReadOnlyModelViewSet):
    queryset = Foo.objects.filter(state=2)
    serializer_class = FooSerializer
class BarViewSet(viewsets.ReadOnlyModelViewSet):
    queryset = Bar.objects.filter(state=2)
    serializer_class = BarSerializer
class BazViewList(generics.ListAPIView):
    queryset = Baz.objects.all()
    authentication_classes = (TokenAuthentication,)
    permission_classes = (IsAuthenticated,)
    serializer_class = BazSerializer
def list(self, request):
    queryset = Baz.objects.all()
    serializer = BazSerializer(queryset, many=True)
    return Response(serializer.data)

urls:

from django.conf.urls import include
from django.conf.urls.defaults import patterns, url
from rest_framework import routers
from rest_framework.authtoken import views as vs
router = routers.DefaultRouter()
router.register(r'Foo', views.FooViewSet)
router.register(r'Bar', views.BarViewSet)
#router.register(r'Baz', views.BazViewList)
urlpatterns = patterns('app.restapi.views',
    url(r'^v1/Baz/', BazViewList.as_view(), name='baz_view_list'),
    url(r'^v1/', include(router.urls)),
    url(r'^v1/api-token-auth/', vs.obtain_auth_token))

现在,如果我浏览v1/端点(应该提供文档(,API根目录只列出Foo和Bar,而不列出Baz:

Api Root
GET /api/rest/v1/
HTTP 200 OK
Content-Type: application/json
Vary: Accept
Allow: GET, HEAD, OPTIONS
{
    "Foo": "http://localhost:8000/api/rest/v1/Foo/",
    "Bar": "http://localhost:8000/api/rest/v1/Bar/"
}
修复此问题的最简单方法是将BazViewList更改为继承自rest_framework.mixins.ListModelMixinrest_framework.viewsets.GenericViewSet:的BazViewSet
from rest_framework import viewsets, mixins
class BazViewSet(mixins.ListModelMixin, viewsets.GenericViewSet):
   ...

这将设置所有内部管道,以便BazViewSet可以注册为路由器,路由器的所有魔力都将为您处理URL。

最新更新