视图家族
一、概述
drf提供了一系列视图及工具:
from rest_framework import views, generics, mixins, viewsets
1、views:视图类
2、mixins:视图工具类
3、generics:工具视图类
4、viewsets:视图集
二、分类
两大视图类:
from rest_reamework.views import APIView
from rest_framework.generics import GenericAPIView
六大视图工具类:
from rest_framework.mixins import RetrieveModelMixin, ListModelMixin, CreateModelMixin, UpdateModelMixin, DestroyModelMixin
九大工具视图类
from rest_framework import generics
generics中有CreateAPIView、ListAPIView、RetrieveAPIView、DestroyAPIView、UpdateAPIView、ListCreateAPIView、RetrieveUpdateAPIView、RetrieveDestroyAPIView、RetrieveUpdateDestroyAPIView。
三、两大视图集基类
两大视图集的基类分别是ViewSet、GenericViewSet,分别继承自View的APIView和GenericAPIView。
1、view:将请求方式和视图类的同名方法见了映射,完成请求响应
2、APIView:继承自Django的View,其具备View的功能。写了as_view,禁用了csrf认证。重写了dispatch:请求、响应、渲染、异常、解析、三大认证。并且添加了一堆类属性,可以完成视图类的局部配置。
再APIView中仍以常规的类视图定义方法来实现get()、post()或其他请求方式方法。
from rest_framework.views import APIView
from rest_framework.response import Respones
# url(r'^v1/students/$', views.StudentAPIView.as_view()),
# url(r'^v1/students/(?P<pk>d+)/$', views.StudentAPIView.as_view()),
class StudentAPIView(APIView):
def get(self, request, *args, **kwargs):
stu_query = models.Student.objects.all()
stu_ser = serializers.StudentModelSerializer(stu_query, many=Ture)
return Response(stu_ser.data)
3、GenericAPIView:具备了APView的所有功能。具备了三个方法get_object()、get_queryset()、get_serializer()。具备了三个属性queryset、serializer_class、lookup_url_kwarg。
from rest_framework.generics import GenericAPIView
class StudentGenericAPIView(GenericAPIView):
queryset = models.Student.objects.all()
serializer_class = serializers.StudentModelSerializer
def get(self, request, *args, **kwargs):
stu_query = slef.get_queryset()
stu_ser = self.get_serializer(stu_query, many=Ture)
return Response(stu_ser.data)
四、视图工具类
mixins包提供了五大工具类和六大工具方法。
五大工具类:RetrieveModelMixin, ListModelMixin, CreateModelMixin, UpdateModelMixin, DestroyModelMixin。
六大工具方法:retrieve、list、create、update、partial_update、destroy。
from rest_framework import mixins
class StudentMixGenericAPIView(mixins.ListModelMixin, mixins.CreateModelMixin, GenericAPIView):
queryset = models.Student.objects.all()
serializer_class = serializers.StudentModelSerializer
def get(self, request, *args, **kwargs):
return self.list(request,*args, **kwargs)
def post(self, request, *args, **kwargs):
return self.create(request,*args, **kwargs)
五、工具视图类
工具视图类提供七个子类视图
1、CreateAPIView:提供post方法
2、ListAPIView:提供get方法
3、RetrieveAPIView:提供get方法
4、RetrieveUpdateAPIView:提供get、put、patch方法
5、UpdateAPIView:提供put和patch方法
6、DestroyAPIView:提供delete方法
7、RetrieveUpdateDestroyAPIView:提供get、put、patch、delete方法
from rest_framework.generics import CreateAPIView, RetrieveAPIView, ListAPIView, UpdateAPIView, DestroyAPIView
class StudentMixinAPIView(CreateAPIView, RetrieveAPIView, ListAPIView, UpdateAPIView, DestroyAPIView):
queryset = models.Student.objects.all()
serializer_class = serializers.StudentModelSerializer
# url中单查,不一定必须提供主键,提供一切唯一键的字段名均可
lookup_url_kwarg = 'id'
# 有删除需求的接口继承DestroyAPIView,重写destroy完成字段删除
def destroy(self, request, *args, **kwargs):
pass
六、视图集
使用视图集ViewSet,可以将一系列逻辑相关的动作放到一个类中:
1、list() 提供一组数据
2、retrieve() 提供单个数据
3、create() 创建数据
4、update() 保存数据
5、destory() 删除数据
ViewSet视图集类不再实现get()、post()等方法,而是实现动作 action 如 list() 、create()
等。
视图集只在使用as_view()方法的时候,才会将action动作与具体请求方式对应上。
urls.py:
# 将所有 请求方式 与 响应方法名 的映射关系交给用户自己配置
url(r'^v5/students/$', views.StudentModelViewSet.as_view({
'get': 'list',
'post': 'my_post'
})),
url(r'^v5/students/(?P<pk>d+)/$', views.StudentModelViewSet.as_view({
'get': 'retrieve',
'put': 'update',
'patch': 'partial_update',
'delete': 'destroy'
})),
views.py:
from rest_framework.viewsets import ModelViewSet
class StudentModelViewSet(ModelViewSet):
queryset = models.Student.objects.all()
serializer_class = serializers.StudentModelSerializer
def my_post(self, request, *args, **kwargs):
return Response('mt post ok')