视图集ViewSet

一 、视图集ViewSet

使用视图集ViewSet,能够将一系列逻辑相关的动做放到一个类中:python

  • list() 提供一组数据
  • retrieve() 提供单个数据
  • create() 建立数据
  • update() 保存数据
  • destory() 删除数据

ViewSet视图集类再也不实现get()post()等方法,而是实现动做 actionlist()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'})
]

二 、经常使用视图集父类

2.1 ViewSet

继承自APIViewViewSetMixin,做用也与APIView基本相似,提供了身份认证、权限校验、流量管理等。rest

ViewSet主要经过继承ViewSetMixin来实如今调用as_view()时传入字典(如{’get’:’list’})的映射处理工做。code

ViewSet中,没有提供任何动做action方法,须要咱们本身实现action方法。对象

2.2GenericViewSet

使用ViewSet一般并不方便,由于listretrievecreateupdatedestory等方法都须要本身编写,而这些方法与前面讲过的Mixin扩展类提供的方法同名,因此咱们能够经过继承Mixin扩展类来复用这些方法而无需本身编写。可是Mixin扩展类依赖与GenericAPIView,因此还须要继承GenericAPIView继承

GenericViewSet就帮助咱们完成了这样的继承工做,继承自GenericAPIViewViewSetMixin,在实现了调用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"})),

]

2.3 ModelViewSet

继承自GenericViewSet,同时包括了ListModelMixinRetrieveModelMixinCreateModelMixinUpdateModelMixinDestoryModelMixin

2.4 ReadOnlyModelViewSet

继承自GenericViewSet,同时包括了ListModelMixinRetrieveModelMixin

三 、视图集中定义附加action动做

在视图集中,除了上述默认的方法动做外,还能够添加自定义动做。

举例:

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对象属性来获取当前请求视图集时的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就是请求的方法名
相关文章
相关标签/搜索