drf序列化組件之視圖家族

一、視圖家族的分類

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  # 指明用的是哪個序列化器

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理【其他文章推薦】

※為什麼 USB CONNECTOR 是電子產業重要的元件?

網頁設計一頭霧水??該從何著手呢? 找到專業技術的網頁設計公司,幫您輕鬆架站!

※想要讓你的商品成為最夯、最多人討論的話題?網頁設計公司讓你強力曝光

※想知道最厲害的台北網頁設計公司推薦台中網頁設計公司推薦專業設計師”嚨底家”!!