使用视图集ViewSet
,能够将一系列逻辑相关的动做放到一个类中:python
list()
提供一组数据retrieve()
提供单个数据create()
建立数据update()
保存数据destory()
删除数据ViewSet
视图集类再也不实现get()
、post()
等方法,而是实现动做 action 如 list()
、create()
等。数据库
视图集只在使用as_view()
方法的时候,才会将action动做与具体请求方式对应上。如:post
class BookInfoViewSet(viewsets.ViewSet): def list(self, request): books = BookInfo.objects.all() serializer = BookInfoSerializer(books, many=True) return Response(serializer.data) def retrieve(self, request, pk=None): try: books = BookInfo.objects.get(id=pk) except BookInfo.DoesNotExist: return Response(status=status.HTTP_404_NOT_FOUND) serializer = BookInfoSerializer(books) return Response(serializer.data)
在设置路由时,咱们能够以下操做url
urlpatterns = [ url(r'^books/$', BookInfoViewSet.as_view({'get':'list'}), url(r'^books/(?P<pk>\d+)/$', BookInfoViewSet.as_view({'get': 'retrieve'}) ]
继承自APIView
与ViewSetMixin
,做用也与APIView
基本相似,提供了身份认证、权限校验、流量管理等。rest
ViewSet
主要经过继承ViewSetMixin
来实如今调用as_view()
时传入字典(如{’get’:’list’}
)的映射处理工做。code
在ViewSet
中,没有提供任何动做action
方法,须要咱们本身实现action
方法。对象
使用ViewSet
一般并不方便,由于list
、retrieve
、create
、update
、destory
等方法都须要本身编写,而这些方法与前面讲过的Mixin
扩展类提供的方法同名,因此咱们能够经过继承Mixin
扩展类来复用这些方法而无需本身编写。可是Mixin
扩展类依赖与GenericAPIView
,因此还须要继承GenericAPIView
。继承
GenericViewSet
就帮助咱们完成了这样的继承工做,继承自GenericAPIView
与ViewSetMixin
,在实现了调用as_view()
时传入字典(如{'get':'list'}
)的映射处理工做的同时,还提供了GenericAPIView
提供的基础方法,能够直接搭配Mixin
扩展类使用。路由
举例:get
from rest_framework.viewsets import GenericViewSet from rest_framework.mixins import ListModelMixin,CreateModelMixin,RetrieveModelMixin,UpdateModelMixin,DestroyModelMixin class Student4ViewSet(GenericViewSet,ListModelMixin,CreateModelMixin,RetrieveModelMixin,UpdateModelMixin,DestroyModelMixin): queryset = Student.objects.all() serializer_class = StudentModelSerializer
url
的定义
urlpatterns = [ path("students7/", views.Student4ViewSet.as_view({"get": "list", "post": "create"})), re_path("students7/(?P<pk>\d+)/", views.Student4ViewSet.as_view({"get": "retrieve","put":"update","delete":"destroy"})), ]
继承自GenericViewSet
,同时包括了ListModelMixin
、RetrieveModelMixin
、CreateModelMixin
、UpdateModelMixin
、DestoryModelMixin
。
继承自GenericViewSet
,同时包括了ListModelMixin
、RetrieveModelMixin
。
在视图集中,除了上述默认的方法动做外,还能够添加自定义动做。
举例:
from rest_framework.viewsets import ModelViewSet,ReadOnlyModelViewSet class StudentModelViewSet(ModelViewSet): queryset = Student.objects.all() serializer_class = StudentModelSerializer def login(self,request): """学生登陆功能""" return Response({"message":"登陆成功"})
url
的定义
urlpatterns = [ path("students8/", views.StudentModelViewSet.as_view({"get": "list", "post": "create"})), re_path("students8/(?P<pk>\d+)/", views.StudentModelViewSet.as_view({"get": "retrieve", "put": "update", "delete": "destroy"})), path("stu/login/",views.StudentModelViewSet.as_view({"get":"login"})) ]
在视图集中,咱们能够经过action
对象属性来获取当前请求视图集时的action
动做是哪一个。
例如:
from rest_framework.viewsets import ModelViewSet from students.models import Student from .serializers import StudentModelSerializer from rest_framework.response import Response class StudentModelViewSet(ModelViewSet): queryset = Student.objects.all() serializer_class = StudentModelSerializer def get_new_5(self,request): """获取最近添加的5个学生信息""" # 操做数据库 print(self.action) # 获取本次请求的视图方法名 经过路由访问到当前方法中.能够看到本次的action就是请求的方法名