drf序列化组件之视图家族

1、视图家族的分类

1.导入分类
from rest_framewok import views, generics, mixins, viewsetspython

views:视图类工具

​ 两大视图类:APIView、GenericAPIViewpost

from rest_framework.views import APIView
from rest_framework.generics import GenericAPIView

mixins:视图工具类url

​ 六大视图工具类: RetrieveModelMixin, ListModelMixin, CreateModelMixin, UpdateModelMixin, DestroyModelMixinspa

from rest_framework.mixins import RetrieveModelMixin, ListModelMixin, CreateModelMixin, UpdateModelMixin, DestroyModelMixin

generics:工具视图类3d

​ 九大工具视图类:...rest

from rest_framework import generics

viewsets:视图集code

​ 两大视图集基类:ViewSet、GenericViewSetorm

from rest_framework import viewsets

2.APIVIiew的特性csrf

它继承了Django的View

​ 1)View:将请求方式与视图类的同名方法创建映射,完成请求响应

​ 2)APIView:

​ 继承了View全部的功能;

​ 重写as_view禁用csrf认证;

​ 重写dispatch:请求、响应、渲染、异常、解析、三大认证

​ 多了一堆类属性,能够完成视图类的局部配置

2、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

3、视图工具类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类

4、工具视图类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...等方法封装起来,咱们直接继承有该方法的类便可。
​ 缺点:

​ 单查与群查不能共存,按照继承顺序决定单查仍是群查,下面介绍的视图集就能完成共存。

5、视图集的用法与介绍

# 视图集
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  # 指明用的是哪一个序列化器
相关文章
相关标签/搜索