Django: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、測試

 

 支持模糊匹配,搞定


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM