所以我想找到任何类型的匹配给定的一些字段,所以例如,这是我想做的:
possible_merchants = ["amazon", "web", "services"]
# Possible name --> "Amazon Service"
Companies.objects.filter(name__icontains__in=possible_merchants)
遗憾的是,在查找中不可能混合使用icontains和__。
这似乎是一个相当复杂的查询,所以如果我至少可以忽略名称的大小写就足够了,例如:
Companies.objects.filter(name__ignorecase__in=possible_merchants)
有什么想法吗
P.D.:我发布的查询不起作用,这只是表达我需要的一种方式(以防万一)
6条答案
按热度按时间lymgl2op1#
你可以用
Q
构造函数创建查询集,然后用|
运算符合并它们以得到它们的并集:(And类似地,使用
iexact
代替icontains
。)b1payxdu2#
我发现使用
reduce
和or_
操作符是一种更清晰的方法:这将创建一个
Q
对象列表,查询name
以在商家列表中包含单个元素。这将发生在merchant_list
中的所有元素,并且所有这些Q
对象将被简化为具有多个OR的单个Q
对象,可以直接应用于过滤器查询。rjzwgtxy3#
这是我采用的方法:
下面是现在使用它:
它的灵感来自于这个线程中的其他答案,以及Django filter queryset __in for every item in list。
h5qlskok4#
另一种方法是模拟Django通常对
iexact
查询所做的操作(它通过SQL Upper函数将比较语句的两个部分都转换为大写。这样,查询将如下所示:
5t7ly7z55#
Gareth Rees的回答在使用django-filter包时对我的类似问题有很大帮助。
要在
django_filters
中以通用的方式使用它,可以像这样创建一个MultipleInputs过滤器:然后在filterset中使用它,并使用自定义过滤方法:
任何MultiInputs字段都不能有逗号分隔的输入。如果您继承了MyFilter,但使用具有不同field_name的Filter覆盖搜索,也可以使用。
vohkndzv6#
使用iregex将是:
你甚至可以添加lookaround,这样就可以保证匹配的是单个单词,而不是其他单词的不同含义的部分,即:
lookaround(即lookbehind + lookahead)不会引起字符消耗,因此它将与子字符串开始或结束字符串匹配,这在[^\w]中是不可能的。