我正在为自动填充表单编写后端代码。我返回的每个条目都由类别名称和该类别中的数字描述。
当用户键入“CAT123”时,我想使用Django过滤器过滤到用户查询中包含的类别名称或数字。
换句话说,我想执行一个类似的查询:
Entry.objects.filter(Q(category__in = query) | Q(num__in = query))
其中过滤器会测试类别AAA
是否在查询AAA 555
中,以及号码555
是否在查询AAA 555
中。< / p>
但是,__in
似乎只适用于列表,__contains
检查另一种方式('AAA 555'不在'AAA'中)。
什么是正确的过滤器表达式用于此“包含在一个字符串”的想法?
或者有没有办法扭转contains
表达式,以便过滤器看起来像Q(query__contains = category)
?
答案 0 :(得分: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))