關於類視圖選擇繼承APIView還是工具視圖(ListAPIView、CreateAPIView等等)


APIView使用方法,直接繼承APIView,get或者post請求。方法很簡單1.先獲取到要操作的數據,然后把數據放到serializer中序列化或者反序列化,最后return返回值(記得.data

1.第一個例子

 2.第二個例子

 主要流程:獲取到數據對象,然后傳入到serializer中校驗,最后response返回前端數據(注意返回的數據要.data)

工具視圖(ListAPIView,CreataAPIView等)

https://www.cnblogs.com/wangcuican/p/11710450.html 工具視圖學習資料

我們要知道上面這些工具視圖是繼承GenericAPIView和Mixins各種工具類的

GenericAPIView

我們要先了解GenericAPIView的用法(比如下面的)(******)

先寫GenericAPIView的兩個屬性:queryset(指明視圖需要的數據,這個主要是針對從數據庫中獲取數據,如果是從前端獲取數據就不用寫queryset了,數據就從reqeust中獲取)和serializer_class指明視圖使用哪個序列化器

如果你寫了上面的兩個屬性,就必須需要使用get_queryset和get_serializer進行操作(特別需要注意******)

get_queryset功能:從類屬性queryset中獲取model的queryset數據

get_serializer功能:從類屬性serializer_class中獲得serializer的序列化類,主要是給Mixin擴展類使用

from rest_framework.generics import GenericAPIView class BookGenericAPIView(GenericAPIView):
    queryset = models.Book.objects.filter(is_delete=False)
    serializer_class = serializers.BookModelSerializer
    # 自定義主鍵的 有名分組 名
    lookup_field = 'pk'    #先定義好,單取可以使用
    # 群取
    def get(self, request, *args, **kwargs):
        book_query = self.get_queryset()  #獲取queryset數據(model查詢數據)
        book_ser = self.get_serializer(book_query, many=True)  #我的理解是數據被[]嵌套就要寫many=True(book_query查出來是queryset類型,如果查出來是object就不用寫many=True)
        book_data = book_ser.data   #返回前台的數據必須需要.data,才能返回(******) return APIResponse(results=book_data)

    # 單取
    def get(self, request, *args, **kwargs):
        book_query = self.get_object()
        book_ser = self.get_serializer(book_query)
        book_data = book_ser.data
        return APIResponse(results=book_data)

Mixins各種工具類(配合GenericAPIView一起使用

mixins有五個工具類文件,一共提供了五個工具類,六個工具方法:單查、群查、單增、單刪、單整體改、單局部改
五個工具類CreateModelMixin(增加),DestroyModelMixin(刪除),ListModelMixin(查詢,查queryset),RetrieveModelMixin(查詢,查對象,針對於存在"pk"),UpdateModelMixin(修改)

舉例子

 

現在我們就有疑問了,前面說了用GenericAPIView,就必須要get_queryset()和serializer_class()。這里Mixins工具類也使用了GenericAPIView為什么沒見這兩個方法。

get_queryset()和serializer_class()這兩個方法在list,create等源碼方法中

源碼:(針對增加數據的源碼create)這里面用到了get_serializer,所以我們在這之前就必須設定一個serializer_class方法。

 

 舉例子:Create增加的用法(這里我們直接用CreateAPIView方法,在源碼中已經繼承GenericAPIView和Mixin工具類。就不用再去自定義類,然后繼承GenericAPIView和Mixin工具類這種麻煩的操作

from rest_framework.generics import CreateAPIView class RegisterCreateAPIView(CreateAPIView):
    serializer_class = serializers.RegisterModelSerializer 

    #重寫create方法,CreateModelMixin中的create方法,下面這段代碼是到create源碼中粘貼過來的(******)
    def create(self, request, *args, **kwargs):
        serializer = self.get_serializer(data=request.data) 
        serializer.is_valid(raise_exception=True)  # 校驗失敗就主動拋異常 => 自定義異常結果,配置異常模塊
        user_obj = serializer.save()  # 要自定義入庫邏輯,重寫serializer中的create方法
        headers = self.get_success_headers(serializer.data)
        # 響應結果需要格式化,使用序列化類要提供序列化與反序列化兩套規則
     #返回前端的數據APIResponse
return APIResponse(0, 'ok', results=serializers.RegisterModelSerializer(user_obj).data, http_status=201, headers=headers )

這里我們為什么要重寫create方法呢,因為想自定義返回值APIResponse,如果你不需要重寫方法,那么這個類下面只寫queryset和serializer_class這兩個屬性就行了。

 

 

 

 

 

 


免責聲明!

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



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