ViewSet

一个ViewSet类只是一种基于类的View,继承自APIView,作用也与APIView基本类似,提供了身份认证、权限校验、流量管理等。

在ViewSet中,它不提供任何方法处理程序,需要我们自己重写该类并明确实现action方法。

class BookViewSet(viewsets.ViewSet):

    def list(self, request):
        pass

    def create(self, request):
        pass

    def retrieve(self, request, pk=None):
        pass

    def update(self, request, pk=None):
        pass

    def partial_update(self, request, pk=None):
        pass

    def destroy(self, request, pk=None):
        pass

一个ViewSet类同时提供以下可用属性

  • basename- 用于创建的URL名称的基础。
  • action- 当前动作的名称(例如listcreate)。
  • detail- 布尔值,指示当前操作是否为列表或详细视图配置。
  • suffix- 视图类型的显示后缀 - 镜像detail属性。

例如:

from rest_framework.viewsets import ViewSet
from django.shortcuts import get_object_or_404
from rest_framework.response import Response
from book.serializers import BookInfoModelSerializer

class BookViewSet(ViewSet):

    def list(self,request):
        queryset = BookInfo.objects.all()
        serializer = BookInfoModelSerializer(queryset,many=True)
        return Response(serializer.data)

    def retrieve(self,request,pk=None):
        queryset = BookInfo.objects.all()
        user = get_object_or_404(queryset, pk=pk)
        serializer = BookInfoModelSerializer(user)
        return Response(serializer.data)

在设置路由时,我们可以如下操作

from django.urls import re_path
from book import views
urlpatterns = [
    re_path(r'^books/$',views.BookViewSet.as_view({'get':'list'})),
    re_path(r'^books/(?P<pk>\d+)/$',views.BookViewSet.as_view({'get':'retrieve'})),
]

替代方案为

from django.urls import re_path
from book import views

urlpatterns = [
    #re_path(r'^books/$',views.BookViewSet({'get':'list'})),
    #re_path(r'^books/(?P<pk>\d+)/$',views.BookViewSet({'get':'retrieve'})),
]

from rest_framework.routers import DefaultRouter

rounter = DefaultRouter()

rounter.register(r'books',views.BookViewSet,basename='')

urlpatterns += rounter.urls

注意: 通常情况下,我们经常使用提供默认行为集的现有基类,例如ModelViewSet