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- 当前动作的名称(例如list,create)。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
