drf模糊查询-第一种方法

  • 直接干:

    1、安装第三方包

    pip install django-filter

    2、settings.py的INSTALLED_APPS中注册应用

    INSTALLED_APPS = [
        ... ...   
        'django_filters',
    ]

    同样settings中加上配置

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

    3、视图类中增加属性 filterset_fields

    class ServerInfoList(generics.ListAPIView):
        """
        获取所有服务器信息
        """
        from django.db.models import Q
        # 使用orm的或查询Q相当于SQL的or关键字,查询集为状态为启用和禁用的
        queryset = ServerInfo.objects.filter(Q(status=1) | Q(status=2)).order_by('-update_time')
        serializer_class = ServerInfoSerializers
        # 渲染页面
        renderer_classes = (renderers.TemplateHTMLRenderer, renderers.JSONRenderer)
        # renderer_classes = [renderers.JSONRenderer]
        template_name = 'server_list.html'
        # 精确过滤,不支持模糊查询,元素为models中定义的需要过滤的字段  
        # filter_backends = [DjangoFilterBackend]
        filterset_fields = ['server_ip', 'app', 'app_port', 'project_name', 'status']

    4、测试

    精确查询结果

     模糊查询----不支持模糊

    好像哪里不对,本文不是要实现模糊搜索吗????

     奥。。。忘了。。。。既然实现了精确查询,那模糊查询很简单,略微改造下就行。

    1、步骤同上,已做,略过

    2、步骤同上,已做,略过

    3、编写过滤器类

    from django_filters.rest_framework import FilterSet
    import django_filters
    from env.models import ServerInfo
    
    
    class ServerInfoFilter(FilterSet):
        """
        ip过滤器,模糊查询
        """
        server_ip = django_filters.CharFilter(field_name='server_ip', lookup_expr='icontains')  # icontains,包含且忽略大小写
    
        class Meta:
            # 指定模型
            models = ServerInfo
            # 指定需要模糊查询的字段
            fields = ['server_ip']

    4、视图类中增加属性  filterset_class

    class ServerInfoList(generics.ListAPIView):
        """
        获取所有服务器信息
        """
        from django.db.models import Q
        # 使用orm的或查询Q相当于SQL的or关键字,查询集为状态为启用和禁用的
        queryset = ServerInfo.objects.filter(Q(status=1) | Q(status=2)).order_by('-update_time')
        serializer_class = ServerInfoSerializers
        # 渲染页面
        # renderer_classes = (renderers.TemplateHTMLRenderer, renderers.JSONRenderer)
        renderer_classes = [renderers.JSONRenderer]
        template_name = 'server_list.html'
        # 精确过滤,不支持模糊查询,需要过滤的字段
        # filter_backends = [DjangoFilterBackend]
        # filterset_fields = ['server_ip', 'app', 'app_port', 'project_name', 'status']
    
        # 模糊匹配查询
        filterset_class = server_info_filter.ServerInfoFilter

    5、测试

     支持模糊匹配,搞定

  •  
posted @ 2022-11-22 13:32  FFLYY  阅读(153)  评论(0编辑  收藏  举报