一, 视图家族的分类
1. 导入分类
from rest_framewok import views, generics, mixins, viewsets
views: 视图类
两大视图类: APIView,GenericAPIView
- from rest_framework.views import APIView
- from rest_framework.generics import GenericAPIView
mixins: 视图工具类
六大视图工具类: RetrieveModelMixin, ListModelMixin, CreateModelMixin, UpdateModelMixin, DestroyModelMixin
from rest_framework.mixins import RetrieveModelMixin, ListModelMixin, CreateModelMixin, UpdateModelMixin, DestroyModelMixin
generics: 工具视图类
九大工具视图类:...
from rest_framework import generics
viewsets: 视图集
两大视图集基类: ViewSet,GenericViewSet
from rest_framework import viewsets
2.APIVIiew 的特性
它继承了 Django 的 View
1)View: 将请求方式与视图类的同名方法建立映射, 完成请求响应
2)APIView:
继承了 View 所有的功能;
重写 as_view 禁用 csrf 认证;
重写 dispatch: 请求, 响应, 渲染, 异常, 解析, 三大认证
多了一堆类属性, 可以完成视图类的局部配置
二, views 视图类的两大视图类的用法与区别
- APIView:
- from rest_framework.views import APIView
- from rest_framework.response import Response
- from . import models,serializers
- # APIView:
- class StudentAPIView(APIView):
- def get(self, request, *args, **kwargs):
- # 群查
- stu_query = models.Sudent.objects.all()
- stu_ser = serializers.StudentModelSerializer(stu_query,many=True)
- print(stu_ser)
- return Response(stu_ser.data)
- GenericAPIView:
- # GenericAPIView:
- from rest_framework.generics import GenericAPIView
- class StudentGenericAPIView(GenericAPIView):
- queryset = models.Sudent.objects.all()
- serializer_class = serializers.StudentModelSerializer
- def get(self, request, *args, **kwargs):
- # 群查
- # stu_query = models.Sudent.objects.all()
- stu_query = self.get_queryset()
- # stu_ser = serializers.StudentModelSerializer(stu_query,many=True)
- stu_ser = self.get_serializer(stu_query, many=True)
- return Response(stu_ser.data)
区别:
1.GenericAPIView 继承了 APIView, 所以它可以用 APIView 所有的功能
2.GenericAPIView 内部提供了三个常用方法:
get_object(): 拿到单个准备序列化的对象, 用于单查
get_queryset(): 拿到含有多条数据的 Queryset 对象, 用于群查
get_serializer(): 拿到经过序列化的的 serializer 对象
3. 三个常用属性:
- queryset
- serializer_class
- lookup_url_kwarg
三, 视图工具类 Mixin 的用法与介绍
以单增和群查为例:
- from rest_framework import mixins
- class StudentMixinGenericAPIView(mixins.ListModelMixin, mixins.CreateModelMixin, GenericAPIView):
- queryset = models.Sudent.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. 提供了五大工具类及其六大工具方法:
CreateModelMixin: create() 实现单增
ListModelMixin: list() 实现群查
RetrieveModelMixin:retrieve() 实现单查
UpdateModelMixin: update() 实现单改 和 perform_update() 实现局部改
DestroyModelMixin : destroy() 实现单删
2. 只要调用工具类的方法, 就可实现该方法的功能, 内部的实现原理据说是将我们之前写的代码进行了一层封装, 所以我们直接调用即可
3. 由于 mixins 里的五大工具类没有继承任何视图类 views, 在配置 url 的时候没有 as_view() 方法, 也就是不能进行任何的增删改查, 所以写视图类时继承 GenericAPIView 类
四, 工具视图类 Mixin 的用法与介绍
- # 工具视图类
- from rest_framework.generics import CreateAPIView, RetrieveAPIView, ListAPIView,UpdateAPIView,DestroyAPIView
- class StudentMixinAPIView(CreateAPIView,ListAPIView,RetrieveAPIView,UpdateAPIView,DestroyAPIView):
- queryset = models.Sudent.objects.all()
- serializer_class = serializers.StudentModelSerializer
- # url 中单查, 不一定必须提供主键, 提供一切唯一键的字段名均可
- lookup_url_kwarg = 'id'
- # 有删除需求的接口继承 DestroyAPIView, 重写 destroy 完成字段删除
- def destroy(self, request, *args, **kwargs):
- pass
分析:
lookup_url_kwarg: url 中单查, 不一定必须提供主键, 提供一切唯一键的字段名均可, url 配置中也要将 pk 改为 id
优点:
CreateAPIView,ListAPIView,RetrieveAPIView,UpdateAPIView,DestroyAPIView 这五个工具类集成了 mixins 与 GenericAPIView 里面的类. 将它们再进行一次封装, 将 get,post... 等方法封装起来, 我们直接继承有该方法的类即可.
缺点:
单查与群查不能共存, 按照继承顺序决定单查还是群查, 下面介绍的视图集就能完成共存.
五, 视图集的用法与介绍
- # 视图集
- from rest_framework.viewsets import ModelViewSet
- class StudentModelViewSet(ModelViewSet):
- queryset = models.Sudent.objects.all()
- serializer_class = serializers.StudentModelSerializer
- def mypost(self, request, *args, **kwargs):
- return Response('my post ok')
分析:
通过使用视图集可以实现单查与群查共存, 原因从查看源代码得知:
ModelViewSet 继承五大工具类之外还继承了 GenericViewSet
GenericViewSet 继承了 ViewSet 再继承了 ViewSetMixin
而在 ViewSetMixin 类里面, 它重写了 as_view() 方法, 根据继承关系, 如果路由匹配上了, 先走 ViewSetMixin 的 as_view() 方法. 在它的 as_view() 方法里面, 它通过给给 as_view() 方法传参数的方式, 对应的工具方法:
它的原理就是通过给传字典, 通过字典里面的数据进行反射, 得到请求想要执行的方法.
在 url 路由中配置, 这样我们就可以区别单查与群查了:
我们还可以自己重写请求要执行的对应方法. 来实现特殊的需求.
注: 由上面的代码可以知道: 除了继承 APIView 的视图类外, 其他视图类都要在该类下设置两个属性:
- queryset = models.Student.objects.all() # 代表跟哪张表建立关系
- serializer_class = serializers.StudentModelSerializer # 指明用的是哪个序列化器
来源: https://www.cnblogs.com/guapitomjoy/p/11924775.html