Django过滤器中用于比较字符串的"In"或"reverse contains"查询

3

我正在编写自动完成表单的后端代码。每个条目都由一个类别名称和该类别中的一个数字描述。

当用户键入"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))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接