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']

在这里插入图片描述

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