django Rest Framework----GenericAPIView 通用視圖 GenericAPIView源碼分析


一、GenericAPIView

GenericAPIView擴展了APIView,為標准列表和詳細視圖添加了常見的行為。

提供的每個具體通用視圖都是一個GenericAPIView或多個mixin類組合在一起而構建的。

例如:

BookView視圖類繼承自:

ListModelMixin:用於顯示所有圖書

CreateModelMixin:添加一本書

GenricAPIView:繼承自APIView,提供as_view()等,獲取當前視圖類中queryset和serializer_class ,用於給ListModelMixin和CreateModelMixin使用。

class BookView(mixins.ListModelMixin, mixins.CreateModelMixin, generics.GenericAPIView):

    queryset = models.Book.objects.all()
    serializer_class = BookModelSerializer

    def get(self,request, *args, **kwargs):
        return self.list(request, *args, **kwargs)

    def post(self,request,*args,**kwargs):
       return self.create(request,*args,**kwargs)

.......

二、GenericAPIView做了哪些事

1.獲取queryset數據,用於所有后續的操作

def get_queryset(self):
    # 斷言,滿足我的條件參會向下執行,否則不執行
    # 所以必須視圖類必須提供一個queryset,例如BookView視圖類中第一行
    assert self.queryset is not None, (
            "'%s' should either include a `queryset` attribute, "
            "or override the `get_queryset()` method."
            % self.__class__.__name__
    )
    # 獲取當前類中的queryset
    queryset = self.queryset
    if isinstance(queryset, QuerySet):
        queryset = queryset.all()
    return queryset

2. 獲取當前類serializer_class  : 該用於驗證和反序列化輸入以及序列化輸出的序列化程序類

def get_serializer_class(self):
    #斷言:必須滿足條件才行
    assert self.serializer_class is not None, (
        "'%s' should either include a `serializer_class` attribute, "
        "or override the `get_serializer_class()` method."
        % self.__class__.__name__
    )
    #返回當前實例對象的serializer_class
    return self.serializer_class

3. lookup_field :用於執行各個模型實例的對象查找的模型字段。默認是'pk'。

需要注意,使用超鏈接的API時,您需要確保雙方的API意見串行類設置查找字段

url(r'books/(?P<pk>\d+)/$',views.BookDetailView.as_view({'get': 'retrieve','put':'update','delete':'destroy'})),

4. 分頁

與列表視圖一起使用時,以下屬性用於控制分頁。

pagination_class :分頁列表結果時應使用的分頁類。默認值與DEFAULT_PAGINATION_CLASS設置值相同,即'rest_framework.pagination.PageNumberPagination'設置pagination_class=None將禁用此視圖的分頁。

5.過濾

filter_backends - 應該用於過濾查詢集的過濾后端類列表。默認值與DEFAULT_FILTER_BACKENDS設置相同。

 


免責聲明!

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



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