1.導入分類
from rest_framewok import views, generics, mixins, viewsets
python
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:請求、響應、渲染、異常、解析、三大認證
多了一堆類屬性,能夠完成視圖類的局部配置
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
以單增和羣查爲例:
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類
# 工具視圖類 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 # 指明用的是哪一個序列化器