"在"或"反向包含"在Django过滤器中查询以比较字符串

时间:2014-04-18 03:52:18

标签: python sql django django-models django-filter

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

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

1 个答案:

答案 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))