1.GenericAPIViews的使用
GenericAPIView
繼承於APIView
,爲常用的列表視圖和詳細視圖提供了一些操作屬性方法。
- 支持分頁、排序
- 繼承
APIView
- 必須指定的類屬性(繼承了APIView的視圖類,必須指定的屬性)
- 1.
queryset
:指定需要使用的查詢集 - 2.
serializer_class
:指定需要使用到的序列化器類
- 1.
先修改一下獲取項目詳情類
class ProjectsDetail(GenericAPIView):
# 指定需要使用的查詢集
queryset = Projects.objects.all()
# 指定需要使用到的序列化器類
serializer_class = ProjectModelSerializer
def get():
....
1.根據id
查詢project
信息
注意一定要指定lookup_field
默認pk
值
class ProjectDetail(GenericAPIView):
queryset = Projects.objects.all()
serializer_class = ProjectModelSerializer
# 修改主鍵路由名稱,那麼定義路由urls時需要是的'<projects/<int:id>/'
lookup_field = 'id'
def get(self, request, pk):
# 此處的pk,是默認的主鍵值,也就是定義路由urls時的'<projects/<int:pk>/'(也可以自定義字段,但是沒必要)
# project = self.get_object(pk)
# GenericAPIView中實現了get_object方法,並且會自動根據傳來的pk值去進行查詢,並返回詳情視圖所需的模型類對象。
# 不需要自己自定義get_object方法,以及不需要特地傳遞pk值
project = self.get_object()
# 使用GenericAPIView的get_serializer方法來獲取序列化器,獲取到的就是上面的類屬性serializer_class
serializer = self.get_serializer(instance=project)
return Response(serializer.data, status=status.HTTP_200_OK)
2.排序
GenericAPIView
有兩種方式進行排序的設置
第一種:在view
視圖類中指定
第二種:在項目的settings.py
文件中指定
2.1、在view視圖類中指定排序
- 1.視圖類繼承
GenericAPIView
from rest_framework.generics import GenericAPIView
- 2.在視圖類中指定所需要的過濾引擎(可多個)
- 3.指定需要排序的字段
- 4.指定查詢集
- 5.指定模型序列化器
# 1.繼承GenericAPIView
class ProjectsList(GenericAPIView):
# 2.在視圖類中指定過濾引擎
# OrderingFilter排序過濾引擎
filter_backends = [filters.OrderingFilter]
# 3.指定需要排序的字段
ordering_fields =['name', 'leader']
# 4.指定查詢集(建議不要直接通過self.queryset來獲取這個類屬性)
queryset =Projects.objects.all()
# 5.指定模型序列化器
serializer_class = ProjectModelSerializer
獲取所有project
信息的get
方法可以這樣修改:
def get(self, request):
# 建議調用get_queryset方法來獲取查詢集
project_qs = self.get_queryset()
# 對查詢集進行過濾(使用的是上面類屬性定義的過濾引擎),並覆蓋,獲取到的是經過排序後的查詢集
project_qs = self.filter_queryset(project_qs)
# 建議使用get_serializer方法來獲取序列化器
serializer = self.get_serializer(instance=project_qs, many=True)
# 響應返回;如果請求沒有指定Accept,那麼默認返回json
return Response(serializer.data, status=status.HTTP_200_OK)
請求:
關鍵字ordering
指定排序的條件(和類中指定的排序字段相同纔有效),默認正序。 前面加-
則是反序
# 根據name進行正序排序
http -v :8000/projects/?ordering=name
# 反序排序
http -v :8000/projects/?ordering= -name
但是這樣的話每個view文件都要指定排序會很麻煩,我們看一下全局指定
2.2、在項目的settings.py文件中指定(全局排序)
需求:所有繼承了GenericAPIView的View類都使用同個排序引擎(排序字段自定義)
- 全局指定排序引擎:
這種方式設置的排序條件,可用於所有使用了該過濾器的view
類 - 步驟:
- 視圖類繼承
GenericAPIView
from rest_framework.generics import GenericAPIView
- 在項目的
settings.py
文件中指定所需要的過濾引擎(可多個) - 視圖類指定需要排序的字段
- 指定查詢集
- 指定模型序列化器
settings.py
文件修改如下:
REST_FRAMEWORK = {
"DEFAULT_RENDERER_CLASSES": (
"rest_framework.renderers.JSONRenderer",
"rest_framework.renderers.BrowsableAPIRenderer",
),
# 設置全局引擎
'DEFAULT_FILTER_BACKENDS': ['rest_framework.filters.OrderingFilter']
}
使用了這種方式後,其它的view
類就不需要指定排序過濾引擎了
如果想要使用排序,首先繼承了GenericAPIView
,然後只需要指定排序的字段即可,然後其它的代碼不變
# filter_backends = [filters.OrderingFilter]
# 3.指定需要排序的字段
ordering_fields = ['name', 'id']