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