32.Django_類視圖_GenericAPIView過濾引擎_排序

1.GenericAPIViews的使用

GenericAPIView繼承於APIView,爲常用的列表視圖和詳細視圖提供了一些操作屬性方法。

  • 支持分頁、排序
  • 繼承APIView
  • 必須指定的類屬性(繼承了APIView的視圖類,必須指定的屬性)
    • 1.queryset:指定需要使用的查詢集
    • 2.serializer_class :指定需要使用到的序列化器類

先修改一下獲取項目詳情類

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
  • 步驟:
  1. 視圖類繼承GenericAPIView
from rest_framework.generics import GenericAPIView
  1. 在項目的settings.py文件中指定所需要的過濾引擎(可多個)
  2. 視圖類指定需要排序的字段
  3. 指定查詢集
  4. 指定模型序列化器
    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']

在這裏插入圖片描述

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