直接干:
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、测试
支持模糊匹配,搞定