如何使用django-filters实现单字段多值icontains模糊查询?
Django Filters单个字段多值模糊匹配实现方案
核心思路
自定义支持多值输入的过滤器类,将传入的多个查询关键词拆分为多个icontains查询条件,通过Q对象拼接为OR逻辑,实现任意数量关键词的模糊匹配。
实现步骤
- 自定义多值模糊匹配过滤器
首先继承BaseInFilter(处理多值输入)和CharFilter(字符字段基础过滤器),重写过滤逻辑拼接OR查询:
from django.db.models import Q import django_filters class MultipleIContainsFilter(django_filters.BaseInFilter, django_filters.CharFilter): def filter(self, qs, value): # 无查询值时直接返回原查询集 if not value: return qs # 拼接OR逻辑的icontains条件 query = Q() for keyword in value: query |= Q(**{f"{self.field_name}__icontains": keyword.strip()}) return qs.filter(query)
- 绑定到模型FilterSet
在你的Content模型对应的过滤器集中,将paragraph字段指定为上述自定义过滤器类型:
from django_filters.rest_framework import FilterSet from .models import Content class ContentFilterSet(FilterSet): # 绑定自定义过滤器到paragraph字段 paragraph = MultipleIContainsFilter(field_name="paragraph") class Meta: model = Content fields = ["paragraph"]
- 接口调用方式
支持两种传参格式,django-filter会自动解析为列表:
- 逗号分隔传参:
/api/content?paragraph=McDonald,MacDonald - 同参数名多次传参:
/api/content?paragraph=McDonald¶graph=MacDonald
自定义调整
- 若需要大小写敏感匹配,将代码中的
__icontains替换为__contains - 若需要查询同时包含所有关键词的结果,将
query |= Q(...)改为query &= Q(...) - 可根据需求新增关键词去重、空值过滤等预处理逻辑
内容的提问来源于stack exchange,提问作者Dave Russell
相关产品推荐
相关产品推荐

