如何在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
相关产品推荐
相关产品推荐

