You need to enable JavaScript to run this app. 如何使用django-filters实现单字段多值icontains模糊查询?
优惠活动
大模型
产品
解决方案
定价
更多

如何使用django-filters实现单字段多值icontains模糊查询?

Django Filters单个字段多值模糊匹配实现方案

核心思路

自定义支持多值输入的过滤器类,将传入的多个查询关键词拆分为多个icontains查询条件,通过Q对象拼接为OR逻辑,实现任意数量关键词的模糊匹配。

实现步骤

  1. 自定义多值模糊匹配过滤器
    首先继承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)
  1. 绑定到模型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"]
  1. 接口调用方式
    支持两种传参格式,django-filter会自动解析为列表:
  • 逗号分隔传参:/api/content?paragraph=McDonald,MacDonald
  • 同参数名多次传参:/api/content?paragraph=McDonald&paragraph=MacDonald

自定义调整

  • 若需要大小写敏感匹配,将代码中的__icontains替换为__contains
  • 若需要查询同时包含所有关键词的结果,将query |= Q(...)改为query &= Q(...)
  • 可根据需求新增关键词去重、空值过滤等预处理逻辑

内容的提问来源于stack exchange,提问作者Dave Russell

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.08 14:15:02