修复此问题的最简单方法是将
视图:
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.ListModelMixin
和rest_framework.viewsets.GenericViewSet
:的BazViewSet
from rest_framework import viewsets, mixins
class BazViewSet(mixins.ListModelMixin, viewsets.GenericViewSet):
...
这将设置所有内部管道,以便BazViewSet可以注册为路由器,路由器的所有魔力都将为您处理URL。