Django过滤器中用于比较字符串的“in”或“反向包含”查询
我正在为一个自动完成的表单编写后端代码。每个返回的条目都有一个类别名称和一个在该类别中的编号。
当用户输入“CAT123”时,我想用Django的过滤器来筛选出用户查询中包含的类别名称或编号。
换句话说,我想执行一个类似这样的查询:
Entry.objects.filter(Q(category__in = query) | Q(num__in = query))
这里过滤器会检查类别 AAA
是否在查询 AAA 555
中,以及编号 555
是否在查询 AAA 555
中。
但是,__in
似乎只适用于列表,而 __contains
是反向检查(‘AAA 555’不在‘AAA’中)。
那么,针对这个“包含在字符串中”的想法,应该使用什么正确的过滤表达式呢?
或者有没有办法反转 contains
表达式,让过滤器看起来像 Q(query__contains = category)
?
1 个回答
0
你应该使用 __contains
,但在使用之前,先把查询分成类别和数字两部分。这是使用正则表达式的一个好例子。下面是一个简单的例子,不过要注意,这个方法对包含Unicode字符的类别名称(比如带有ü、é、ø、ā等字母的名称)效果不好。如果你想要更灵活的正则表达式,可以找找其他的教程。
import re
entries = [
"sdf",
"A124",
"124",
"ASDF 124",
]
for i, e in enumerate(entries):
number = re.search(r'\d+', e)
word = re.search(r'[A-Za-z]+', e)
print i
if number:
print( " " + number.group() )
if word:
print( " " + word.group() )
返回结果:
0
sdf
1
124
A
2
124
3
124
ASDF
你可以这样使用捕获到的匹配结果:
Entry.objects.filter(Q(category__contains = word) | Q(num__contains = number))