【问题标题】:"In" or "reverse contains" query in Django filters for comparing stringsDjango过滤器中用于比较字符串的“In”或“reverse contains”查询
【发布时间】:2014-06-02 13:09:52
【问题描述】:

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

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

【问题讨论】:

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


    【解决方案1】:

    您应该使用__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))
    

    【讨论】:

      猜你喜欢
      • 2022-10-13
      • 2015-04-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-27
      • 2023-03-10
      • 1970-01-01
      • 2011-05-16
      • 1970-01-01
      相关资源
      最近更新 更多