Python 筛选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='

我有一个django模型和一个表示用户全名的字段。我的客户希望我设置一个过滤器,根据字符串数组搜索用户,其中所有字符串都必须包含在全名中,不区分大小写

比如说

如果用户
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]))