Python 筛选Django数据库中包含数组中任何值的字段
我有一个django模型和一个表示用户全名的字段。我的客户希望我设置一个过滤器,根据字符串数组搜索用户,其中所有字符串都必须包含在全名中,不区分大小写 比如说 如果用户Python 筛选Django数据库中包含数组中任何值的字段,python,django,django-models,Python,Django,Django Models,我有一个django模型和一个表示用户全名的字段。我的客户希望我设置一个过滤器,根据字符串数组搜索用户,其中所有字符串都必须包含在全名中,不区分大小写 比如说 如果用户full\u name=“Keith,Thomson S.” 我有一个列表['keith','s','thomson'] 我想执行与 Profile.objects.filter(full_name__icontains='keith',full_name__icontains='s',full_name__icontains='
full\u name=“Keith,Thomson S.”
我有一个列表['keith','s','thomson']
我想执行与
Profile.objects.filter(full_name__icontains='keith',full_name__icontains='s',full_name__icontains='thomson')
问题是这个列表可能是动态大小的-所以我不知道如何做到这一点
有人有什么想法吗?连续调用
过滤器
,如下所示:
queryset = Profile.objects.all()
strings = ['keith', 's', 'thompson']
for string in strings:
queryset = queryset.filter(full_name__icontains=string)
或者,您可以&
组合一组Q
对象:
condition = Q(full_name__icontains=s[0])
for string in strings[1:]:
condition &= Q(full_name__icontains=string)
queryset = Profile.objects.filter(condition)
一种更隐晦的书写方式,避免显式循环:
import operator
# ...
condition = reduce(operator.and_, [Q(full_name__icontains=s) for s in strings])
queryset = Profile.objects.filter(condition)
大致如下:
array = ['keith', 's', 'thomson']
regex = '^.*(%s).*$' % '|'.join(array)
Profile.objects.filter(full_name__iregex=regex)
编辑:这是错误的,OP希望名称同时包含所有字符串。使用
操作符和
或或
组合Q()
条件的列表,名称甚至更短
from operator import and_, or_
li = ['keith', 's', 'thompson']
匹配所有字符串的项(和
)
与任何字符串(或
)匹配的项
Q()
函数实现了\uu或
和\uuuu和
将两个Q()
对象连接在一起,这样就可以使用相应的操作符调用它们。我想知道链接所有这些过滤器后最终的sql表达式是什么样子。@akonsu我刚刚尝试过它(好吧,类似的东西)--它在where
子句中被翻译成一系列和s,即全名,如%keith%和全名,如%s%和…
@isbadawi,+1-注意,多个Q对象的默认运算符是,因此您可以只*[Q1,Q2,Q3]
不使用reduce/operator.and.@IsmailBadawi--这也适用于主键。我有类似的问题,obj=ModelClass.objects.filter(name\uu包含(“substr”))name是主键吗?
Profile.objects.filter(reduce(and_, [Q(full_name__icontains=q) for q in li]))
Profile.objects.filter(reduce(or_, [Q(full_name__icontains=q) for q in li]))