class GenericAPIView(views.APIView):
建議搭配源碼閱讀更好
一。屬性
1. queryset = None (重要)
字面意思,就是models的queryset, 一般通過 models.someModel.objects.all() 賦值
2. serializer_class = None (重要)
序列化的類,可以自己定製序列化的類賦值來決定序列化哪個模型,怎麼序列化
通常的序列的語句如下:重要的是第二句,要傳入 queryset 對象
planObj = models.Plan.objects.all()
planSer = myAppSerializer.PlanSerializer(instance=planObj, many=True) # 重要
print(planSer.data) # 這個是序列化的數據
return Response(planSer.data)
3. lookup_field = 'pk' models中的字段名或者url中的參數名
lookup_url_kwarg = None url中的參數名,就是下面PK
url('^api/v1/plan/(?P<pk>\d+)/$', views.PlanView.as_view({'get':'retrieve'}), name='plan2'),
url 中正則表達式查詢的關鍵參數名,上面那個是要查詢的字段名,下面那個是傳進來的的值名,當然只寫上面那個也可以,這樣兩個都一樣。
4. filter_backends = api_settings.DEFAULT_FILTER_BACKENDS
過濾規則,即傳入參數 ?canshu=canshu,時的過濾規則,這個要自己創立一個類來進行過濾
5. pagination_class = api_settings.DEFAULT_PAGINATION_CLASS (重要)
分頁的類,可以自己定製分頁的類賦值來決定分頁哪個模型,怎麼分頁
通常的分頁的語句如下:重要的是第二句和第三句,先實例化分頁對象得到pg,然後調用 paginate_queryset()來分頁,當然傳入的還是 queryset
roles = models.Role.objects.all() #獲取所有數據
pg = MyPageNumberPagination() # 實例化一個分頁對象
pager_roles = pg.paginate_queryset(queryset=roles, request=request, view=self) # 把querySet數據傳進去
ser = PageSerialiser(instance=pager_roles, many=True) # 對數據進行序列化
ret = pg.get_paginated_response(ser.data)
return ret
二。方法
1. get_queryset(self) (重要)
這個方法很簡單,就是返回一個你傳進 queryset 屬性的 queryset 對象
2. get_object(self) (重要)
這個方法主要是獲得單個模型對象:
1. 先對 queryset 進行過濾(調用 filter_queryset 函數根據我們定製的過濾規則 filter_backends 進行過濾)
2. 獲取要篩選的字段(這裏主要用的是lookup屬性來進行篩選,也就是url中的參數)
3. 運用 get_object_or_404 獲取單個對象
4. 查看是否有權限
5. 返回對象
3. get_serializer(self) (重要)
獲取序列化的類,獲取上下文,上下文有 request 等,然後對 serializer_class(*args, **kwargs) 進行序列化,返回的是序列化對象,也就是序列化屬性中的 planSer
4. get_serializer_class(self)
獲取我們定義的序列化類,這個可以搭配上面的方法使用
5. get_serializer_context(self)
獲取上下文信息,主要有 request, format, view(self)
6. filter_queryset(self, queryset)
過濾 queryset , 只要知道傳入 queryset,返回過濾後的 queryset。 過濾規則要另寫,然後賦值給 filter_backends 就行了
7. paginator(self)
1. 判斷是否有分頁對象
2. 有則賦值給 self._paginator 沒有則賦值 None 給 self._paginator
8. paginate_queryset(self, queryset) (重要)
1. 判斷是否有分頁屬性
2. 沒有則返回None,有則進行分頁操作,分頁操作關鍵就是上面分頁屬性中的一句類似的,就是傳入參數 request 和 view
return self.paginator.paginate_queryset(queryset, self.request, view=self)
9. get_paginated_response(self, data)
返回的是具有額外屬性 Response 的分頁對象
return self.paginator.get_paginated_response(data)