Django DRF -视图集ViewSet
前言
一个ViewSet类只是一种基于类的View,它不提供任何方法处理程序(如get()orpost()),而是提供诸如list()和create()之类的操作。
使用ViewSet类比使用View类有两个主要优点。
- 重复的逻辑可以合并成一个类。例如我们只需要指定queryset一次,它将用于多个视图。
- 通过使用路由器,我们不再需要处理自己的URL配置
ViewSet
一个ViewSet类只是一种基于类的View,继承自APIView,作用也与APIView基本类似,提供了身份认证、权限校验、流量管理等。
在ViewSet中,它不提供任何方法处理程序,需要我们自己重写该类并明确实现action方法。
class BookViewSet(viewsets.ViewSet):def list(self, request):passdef create(self, request):passdef retrieve(self, request, pk=None):passdef update(self, request, pk=None):passdef partial_update(self, request, pk=None):passdef 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 BookInfoModelSerializerclass 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 viewsurlpatterns = [#re_path(r'^books/$',views.BookViewSet({'get':'list'})),#re_path(r'^books/(?P<pk>\\d+)/$',views.BookViewSet({'get':'retrieve'})),
]from rest_framework.routers import DefaultRouterrounter = DefaultRouter()rounter.register(r'books',views.BookViewSet,basename='')urlpatterns += rounter.urls
以上就是django DRF的视图集ViewSet的基本介绍,但是在开发中我们一般不适用,因为用起来比较麻烦。
之后我会更新一篇关于模型视图集ModelViewSet的基本使用,这也是在开发中常用的方式。