zl程序教程

您现在的位置是:首页 >  后端

当前栏目

Django:DRF实现模糊搜索

django搜索 实现 模糊 drf
2023-09-11 14:21:03 时间

直接干:

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、测试

 

 支持模糊匹配,搞定