Django过滤器中用于比较字符串的“in”或“反向包含”查询

3 投票
1 回答
1299 浏览
提问于 2025-04-18 03:13

我正在为一个自动完成的表单编写后端代码。每个返回的条目都有一个类别名称和一个在该类别中的编号。

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

撰写回答