17、Django_rest framework__过滤引擎_排

2019-12-10  本文已影响0人  猪儿打滚

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

GenericAPIView

## 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时需要是的'<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

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
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)
# 根据name进行正序排序
 http -v :8000/projects/?ordering=name
# 反序排序
 http -v :8000/projects/?ordering= -name
2.2、在项目的settings.py文件中指定(全局排序)

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

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']
上一篇 下一篇

猜你喜欢

热点阅读