回答问题

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

例如

如果一个用户full_name = "Keith, Thomson S."

我有一个列表['keith','s','thomson']

我想执行相当于的过滤器

Profile.objects.filter(full_name__icontains='keith',full_name__icontains='s',full_name__icontains='thomson')

问题是这个列表可以是动态大小的——所以我不知道该怎么做。

有人有想法么?

Answers

连续调用filter,如下所示:

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)
Logo

学AI,认准AI Studio!GPU算力,限时免费领,邀请好友解锁更多惊喜福利 >>>

更多推荐