17、Django_rest framework__过滤引擎_排序

前言:rest framework的引擎,都是“可插拔”的,十分方便

GenericAPIView

  • 支持分页、排序
  • 继承APIView
  • 必须指定的类属性(继承了APIView的视图类,必须指定的属性)
    1.queryset:指定需要使用的查询集
    2.serializer_class :指定需要使用到的序列化器类
  • 详情页视图
    1.lookup_field:查询详情数据时使用的字段名,默认为pk
    2.lookup_url_kwarg:查询详情数据时的url路径参数名词,默认和lookup_field相同
  • 支持的类方法
    1.get_queryset(self):返回视图使用的查询集对象
    1. get_object(self):返回详情视图所需要的模型类对象、默认使用lookup_field(pk)参数来进行过滤、如果访问的模型类对象不存在,则返回404
      3.get_serializer(self, *args, **kwargs):返回序列化器对象
      4.get_serializer_class(self):返回序列化器类,默认返回serializer_class,该方法可以重写
  • 过滤引擎(排序)
    1.filter_backends
    2.fiterset_fields
    3.步骤
## 1.安装开源过滤引擎
# pip install django-filter
from django_filters.rest_framework import DjangoFilterBackend

from django_filters.rest_framework import DjangoFilterBackend

## 2.在视图类或全局指定过滤引擎
filter_backends = [DjangoFilterBackend]

## 3.指定需要过滤的字段
#filterset_fields = ['id']
filter_fields = ['id']


## 4.在settings.py文件中,全局指定过滤引擎
INSTALLED_APPS = [
               'django_filters',
]

REST_FRAMEWORK =  {
            'DEFAULT_FILTER_BACKENDS':
 ['django_filters.rest_framework.DjangoFilterBackend']
}

代码实践

## 1、继承GenericAPIView
class ProjectsDetail(GenericAPIView):
    # 2、指定需要使用的查询集
    queryset = Projects.objects.all()
    # 3、指定需要使用到的序列化器类
    serializer_class = ProjectModelSerializer
    
    def get():
        ....
1.根据id查询projcet信息
class ProjectDetail(GenericAPIView):
    queryset = Projects.objects.all()
    serializer_class = ProjectModelSerializer    
    # 修改主键路由名称,那么定义路由urls时需要是的'/'
    lookup_field = 'id'
    def get(self, request, pk):  # 此处的pk,是默认的主键值,也就是定义路由urls时的'/'(也可以自定义字段,但是没必要)
        # 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.指定模型序列化器
from rest_framework.filters import OrderingFilter
from rest_framework.generics import GenericAPIView

    # 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
2.2、在项目的settings.py文件中指定(全局排序)

需求:所有继承了GenericAPIView的View类都使用同个排序引擎(排序字段自定义)

  • 全局指定排序引擎:
    这种方式设置的排序条件,可用于所有使用了该过滤器的view类
  • 步骤:
    1.视图类继承GenericAPIView
    from rest_framework.generics import GenericAPIView
    2.在项目的settings.py文件中指定所需要的过滤引擎(可多个)
    3.视图类指定需要排序的字段
    4.指定查询集
    5.指定模型序列化器
REST_FRAMEWORK = {    
"DEFAULT_RENDERER_CLASSES": (
        "rest_framework.renderers.JSONRenderer",
        "rest_framework.renderers.BrowsableAPIRenderer",
    ),
    # 设置全局引擎
    'DEFAULT_FILTER_BACKENDS': ['rest_framework.filters.OrderingFilter']
}

使用了这种方式后,其它的view类就不需要指定排序过滤引擎了
如果想要使用排序,首先继承了GenericAPIView,然后只需要指定排序的字段即可,然后其它的代码不变

ordering_fields = ['name', 'id']

你可能感兴趣的:(17、Django_rest framework__过滤引擎_排序)