Django-rest-framework中的GenericAPIView(views.APIView)類詳解,理解可以提高開發效率

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)

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章