GenericAPIView的使用及和視圖擴展類的結合使用


GenericAPIView的使用

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()),

]

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM