zoukankan      html  css  js  c++  java
  • DRF框架GenericAPIView之过滤查询

    GenericAPIView为APIView的子类,它拓展了过滤、查询、分页的功能,本章主要介绍过滤的使用方法

    一、引入方式

    from rest_framework.generics import GenericAPIView

    二、GenericAPIView

    • 视图继承GenericAPIView
    • 往往要指定queryset类属性,表示当前接口需要使用到的查询集(查询集对象)
    • 往往要指定serializer_class类属性,表示当前接口需要使用到的序列化器类
    • 在对应的请求方法中,使用self.get_queryset()方法,获取查询集对象,建议不要直接使用self.queryset
    • 可以使用self.get_serializer()方法调用序列化器类
    from rest_framework.response import Response
    from rest_framework import status
    from rest_framework.generics import GenericAPIView
    from .models import Projects
    from .serializers import ProjectsModelSerializer
    
    
    class ProjectsPage(GenericAPIView):
        '''
        类视图
        '''
        queryset = Projects.objects.all()
        serializer_class = ProjectsModelSerializer
    
        def get(self, request):
            qs = self.get_queryset()
            serializer_obj = self.get_serializer(instance=qs, many=True)
            return Response({'code': 0, 'res': "success", 'msg': serializer_obj.data}, status=status.HTTP_200_OK)

    三、过滤

    1.安装django-filter第三方库

    pip install -i https://pypi.douban.com/simple django-filter

    2.配置django-filter

    在项目下的settings.py模块中全局指定过滤引擎

    INSTALLED_APPS = [
        'django_filters'
    ]

    3.引入方式

    from django_filters.rest_framework import DjangoFilterBackend

    4.使用方法

    a.在视图中指定过滤引擎,也可以在全局指定

    1)视图中指定,如果要指定多个引擎,直接继续添加到该列表中
    filter_backends = [DjangoFilterBackend]
    2)全局指定

    在项目下的settings.py模块下的REST_FRAMEWORK中设置属性

    REST_FRAMEWORK = {
        'DEFAULT_FILTER_BACKENDS': 'django_filters.rest_framework.backends.DjangoFilterBackend'
    }

    b.指定需要过滤的字段,过滤的字段需要与模型类中的字段保持一致

    filterset_fields = ['name', 'leader', 'programmer', 'tester']

    c.调用self.filter_queryset()方法,传递一个查询集对象,并返回一个查询集

    from rest_framework.response import Response
    from rest_framework import status
    from rest_framework.generics import GenericAPIView
    from django_filters.rest_framework import DjangoFilterBackend
    from .models import Projects
    from .serializers import ProjectsModelSerializer
    
    
    class ProjectsPage(GenericAPIView):
        '''
        类视图
        '''
        queryset = Projects.objects.all()
        serializer_class = ProjectsModelSerializer
    
        filter_backends = [DjangoFilterBackend]
        filterset_fields = ['name', 'leader', 'programmer', 'tester']
    
        def get(self, request):
            qs = self.get_queryset()
            qs = self.filter_queryset(qs)
            serializer_obj = self.get_serializer(instance=qs, many=True)
            return Response({'code': 0, 'res': "success", 'msg': serializer_obj.data}, status=status.HTTP_200_OK)

    查询结果展示:

  • 相关阅读:
    使用excel2003中的solver解决最优化问题
    图的邻接表存储方式的建立
    LINUX下使用VI
    LINUX下基本命令
    应用程序各对象创建的顺序
    zookeeper常遇错误详解
    MapReduce_partition
    MapReduce_TopK
    MapReduce_MaxValue
    Hbase用java基础操作
  • 原文地址:https://www.cnblogs.com/xiaogongjin/p/13337956.html
Copyright © 2011-2022 走看看