一、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
設置相同。