from rest_framework.generics import GenericAPIView GenericAPIView繼承 APIView,主要增加了操作序列化器和數據庫查詢的方法,作用是為下面Mixin擴展類的執行提供方法支持。通常在使用時,可搭配一個或多個Mixin擴展 因此也是需要進行序列化的三個步驟,但是是使用GenericAPIView的時候,必須要有一個前提,就是:必須申明當前視圖類中操作的模型數據是 queryset = BookInfo.objects.all() # 必須申明當前視圖類中操作的模型數據是什么, 也可以選擇性的增加 serializer_class = BookInfoModelSerializer # 可以聲明當前要調用的序列化器是什么
1、利用GenericAPIView獲取所有 的數據
完整的例子: # views.py # GeneriaAPIView的使用 from rest_framework.generics import GenericAPIView from app01.serializers import BookInfoModelSerializer from rest_framework.response import Response class BookInfoGenericAPIView(GenericAPIView): queryset = BookInfo.objects.all() # 必須申明當前視圖類中操作的模型數據是什么 serializer_class = BookInfoModelSerializer # 可以聲明當前要調用的序列化器是什么 def get(self,request): print("reqeust的數據是",request) # <rest_framework.request.Request object at 0x000000FA185102B0> 對象 # 第一步:操作數據 獲取所有數據 data_list=self.get_queryset() print("data_Lists數據是",data_list) # 從數據庫中查詢到的QuerySet 數據 列表 # 第二步 序列化 serializer=self.get_serializer(instance=data_list,many=True) print("serializer的數據是>>",serializer) # 第三步L:響應數據 return Response(serializer.data) # urls.py from django.urls import path,re_path from . import views urlpatterns=[ # as_view是繼承的APIView path("app03/",views.BookInfoGenericAPIView.as_view()), ]
2、利用GenericAPIView獲取一條數據
view.py
# 利用GenericAPIView獲取一條數據,需要傳入當前查詢的數據的pk值 from rest_framework.generics import GenericAPIView from app01.serializers import BookInfoModelSerializer from booktest.models import BookInfo from rest_framework.response import Response class BookInfo2GenericAPIView(GenericAPIView): # GenericAPIView必須要要queryset 和 serilizer_class queryset = BookInfo.objects.all() # 申明當前操作的模型數據是什么 serializer_class = BookInfoModelSerializer # 聲明當前使用的序列化器什么 def get(self,request,pk): print("執行沒?") # 三步驟: # 第一步:操作數據,根據id獲取一條數據[使用self.get_object的前提是路由中必須聲明一個pk的路由參數, # 如果沒有這個參數,則報錯] book=self.get_object() print("book〉〉",book) # book〉〉 圖書:《射雕英雄傳》 # 第二步:序列化 serializer=self.get_serializer(instance=book) print("serializer>>",serializer) # s是一個serialzer的模型的顯示 # 第三步:響應數據 return Response(serializer.data)
urls.py
from django.urls import path,re_path from . import views urlpatterns=[ re_path("app03/(?P<pk>\d+)",views.BookInfo2GenericAPIView.as_view()), ]
ps:
ps: 01: serializer=self.get_serializer(instance=book)其中的參數說明 ##### get_serializer(self, *args, \**kwargs) 返回序列化器對象,主要用來提供給Mixin擴展類使用,如果我們在視圖中想要獲取序列化器對象,也可以直接調用此方法。 **注意,該方法在提供序列化器對象的時候,會向序列化器對象的context屬性補充三個數據:request、format、view,這三個數據對象可以在定義序列化器時使用。** - **request** 當前視圖的請求對象 - **view** 當前請求的類視圖對象 - format 當前請求期望返回的數據格式 02:**get_object(self)** 返回詳情視圖所需的模型類數據對象,主要用來提供給Mixin擴展類使用。 在試圖中可以調用該方法獲取詳情信息的模型類對象。 **若詳情訪問的模型類對象不存在,會返回404。** 該方法會默認使用APIView提供的check_object_permissions方法檢查當前對象是否有權限被訪問。 舉例: # url(r'^books/(?P<pk>\d+)/$', views.BookDetailView.as_view()), class BookDetailView(GenericAPIView): queryset = BookInfo.objects.all() serializer_class = BookInfoSerializer def get(self, request, pk): book = self.get_object() # get_object()方法根據pk參數查找queryset中的數據對象 serializer = self.get_serializer(book) return Response(serializer.data)
3、利用GenriacAPIView結合mixins的5個擴展視圖類進行數據的增刪改查詢
''' GericAPIView可以和視圖擴展類進行結合,來快速簡化視圖方法的代碼 提供了幾種后端視圖(對數據資源進行曾刪改查)處理流程的實現,如果需要編寫的視圖屬於這五種, 則視圖可以通過繼承相應的擴展類來復用代碼,減少自己編寫的代碼量。 這五個擴展類需要搭配GenericAPIView父類,因為五個擴展類的實現需要調用GenericAPIView提供的序列化器與數據庫查詢的方法。 mixins內的五個視圖擴展類: ListModelMixin列表視圖擴展類,提供`list(request, *args, **kwargs)`方法快速實現列表視圖,返回200狀態碼。 該Mixin的list方法會對數據進行過濾和分頁。 CreateModelMixin :創建視圖擴展類,提供`create(request, *args, **kwargs)`方法快速實現創建資源的視圖,成功返回201狀態碼。 如果序列化器對前端發送的數據驗證失敗,返回400錯誤。 RetrieveModelMixin:詳情視圖擴展類,提供`retrieve(request, *args, **kwargs)`方法,可以快速實現返回一個存在的數據對象。 如果存在,返回200, 否則返回404。 UpdateModelMixin:更新視圖擴展類,提供`update(request, *args, **kwargs)`方法,可以快速實現更新一個存在的數據對象。 同時也提供`partial_update(request, *args, **kwargs)`方法,可以實現局部更新。 成功返回200,序列化器校驗數據失敗時,返回400錯誤 DestroyModelMixin:刪除視圖擴展類,提供`destroy(request, *args, **kwargs)`方法,可以快速實現刪除一個存在的數據對象。 成功返回204,不存在返回404。 '''
views.py
from rest_framework.generics import GenericAPIView from booktest.models import BookInfo from app01.serializers import BookInfoModelSerializer from rest_framework import mixins ''' mixins 類中有5個視圖函數,這個五個視圖函數有不同的作用,但是基本是 對數據的增刪改查視圖 ''' class BookInfoMixinAPIView(GenericAPIView, mixins.ListModelMixin, mixins.CreateModelMixin): # 必須要先聲明 queryset和serializer_class queryset = BookInfo.objects.all() serializer_class = BookInfoModelSerializer # 查詢獲取所有數據 def get(self, request): return self.list(request) # 添加數據 def post(self,request): return self.create(request) # CreateModelMixin內部有創建函數 from rest_framework.generics import GenericAPIView from rest_framework import mixins from app01.serializers import BookInfoSerializer from booktest.models import BookInfo # 通過GericAPIView和mixins下的修改,刪除,獲取一條數據來編寫簡化版的視圖函數 class BookInfo2MixinAPIView(GenericAPIView, mixins.RetrieveModelMixin,mixins.DestroyModelMixin,mixins.UpdateModelMixin): # 必須要先聲明 queryset和serializer_class queryset = BookInfo.objects.all() serializer_class = BookInfoModelSerializer # 獲取一條數據 def get(self,request,pk): return self.retrieve(request,pk) # 更新一條數據 def put(self, request, pk): return self.update(request,pk) # 刪除一條數據 def delete(self,request,pk): return self.destroy(request,pk)
urls.py
from django.urls import path,re_path from . import views urlpatterns=[ # re_path("app03/(?P<pk>\d+)/",views.BookInfo3APIView.as_view()), path("app03/",views.BookInfoGenericAPIView.as_view()), re_path("app03/(?P<pk>\d+)",views.BookInfo2GenericAPIView.as_view()), path("book01/",views.BookInfoMixinAPIView.as_view()), re_path("book02/(?P<pk>\d+)",views.BookInfo2MixinAPIView.as_view()), ]