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