【问题标题】:Django ORM underscore wildcardDjango ORM 下划线通配符
【发布时间】:2019-03-14 22:04:21
【问题描述】:

我一直在寻找一种使用 Django ORM 来使用 SQL 下划线通配符的方法,并做一些等效的事情:

SELECT * FROM table
WHERE field LIKE 'abc_wxyz'

目前,我正在做:

field_like = 'abc_wxyz'
result = MyClass.objects.extra(where=["field LIKE " + field_like])

我已经尝试过 contains() 和 icontains(),但这不是我需要的,因为它的作用是在查询中添加括号:

SELECT * FROM table
WHERE field LIKE '%abc/_wxyz%'

谢谢!

【问题讨论】:

  • 在查询中添加括号是什么意思?一般来说,在 Django ORM 上,contains 相当于 '%abc%',startswith 相当于 'abc%',endswith 相当于 '%abc'
  • 你说得对,我的意思是百分比字符
  • 我没有注意到您查询中的“_”字符。您可以使用“__regex”来使用正则表达式进行过滤

标签: sql django orm


【解决方案1】:

您可以使用 __regex 查找来构建比 __contains__startswith__endswith 更复杂的查找表达式(可以在每个开头添加“i”字符以使查找不区分大小写,例如图标)。在你的情况下,我认为

MyClass.objects.filter(field__regex=r'^abc.wxyz$')

会做你想做的事。

【讨论】:

  • 谢谢,这正是我需要的!
【解决方案2】:

您可以使用field__contains attribute

例如:

MyClass.objects.filter(field__contains='abc_wxyz')

这相当于:

SELECT * FROM MyClass WHERE field LIKE 'abc_wxyz'

【讨论】:

    【解决方案3】:

    埃尔隆勋爵的回答不正确。 Django 将所有开发人员提供的通配符转义到 LIKE 类型的查找。该语句相当于

    SELECT * FROM MyClass WHERE field LIKE '%abc/_wxyz%'
    

    (正如 OP 发现的那样)并且下划线无效。

    Escaping percent signs and underscores in LIKE statements

    等同于 LIKE SQL 语句(iexact、contains、icontains、startswith、istartswith、endswith 和 iendswith)的字段查找将自动转义 LIKE 语句中使用的两个特殊字符——百分号和下划线。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-08-24
      • 1970-01-01
      • 1970-01-01
      • 2014-05-06
      • 2012-08-09
      • 2013-02-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多