You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Django中对QuerySet进行不区分大小写的__in过滤?

Django模型不区分大小写的in过滤方案

针对你的Skill模型,要实现不区分大小写的name__in过滤,有以下几种可行方法:

方法一:使用数据库Lower函数匹配

将数据库中的name字段转为小写,同时把目标列表的元素也转为小写,再进行匹配,这是兼容性较好的方案:

from django.db.models.functions import Lower

skill_names = ['Code Quality', 'Analytical Thinking', 'Productivity', 'Communication']
# 把目标列表元素转为小写
skill_names_lower = [name.lower() for name in skill_names]
# 过滤时将数据库name字段转小写后匹配
skills = Skill.objects.filter(Lower('name')__in=skill_names_lower)

方法二:使用Q对象逐个匹配icontains

如果列表元素不多,可以用Q对象组合多个icontains条件,实现不区分大小写的匹配:

from django.db.models import Q

skill_names = ['Code Quality', 'Analytical Thinking', 'Productivity', 'Communication']
# 构建Q对象列表
q_objects = Q()
for name in skill_names:
    q_objects |= Q(name__icontains=name)
# 执行过滤
skills = Skill.objects.filter(q_objects)

注意:这种方法会生成多个OR条件,当列表元素过多时,可能影响查询性能。

方法三:使用iregex正则匹配

将目标列表转为不区分大小写的正则表达式,通过iregex进行匹配:

import re

skill_names = ['Code Quality', 'Analytical Thinking', 'Productivity', 'Communication']
# 转成正则表达式,用|分隔,同时转义特殊字符
pattern = '|'.join(re.escape(name) for name in skill_names)
# 使用iregex过滤(不区分大小写)
skills = Skill.objects.filter(name__iregex=pattern)

注意:如果列表元素数量多或包含大量特殊字符,正则表达式可能过长,建议谨慎使用。

内容的提问来源于stack exchange,提问作者Tanvir Ahmed

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 19:51:20