【问题标题】:How to do wildcard search for single character replacement ( _ ) in Django ORM?如何在 Django ORM 中进行单字符替换( _ )的通配符搜索?
【发布时间】:2019-11-19 20:21:34
【问题描述】:

我有一个案例需要使用 Django ORM 进行通配符搜索。

我有一个列 - column1,其中包含手机号码。

我需要对_ 中的MySQL 中的单个字符替换进行通配符搜索。

我可以像 Mobilenumbers.objects.raw('SELECT * FROM MOBILENUMBERS WHERE COLUMN1 LIKE '98765_7644') 那样做。但是我如何在 Django ORM 中做同样的事情。

不是Wildcard searching in Django 的重复。

【问题讨论】:

  • SQL 中的单字符通配符是%
  • 我猜% 代表zeromore 字符。但不是exactly one character
  • @KlausD。 _ 是单个字符。 % 是多个字符。

标签: python django django-models wildcard django-orm


【解决方案1】:

您可以使用__regex lookup [Django-doc],例如:

Mobilenumbers.objects.filter(
    column1__regex=r'^98765.7644$'
)

你甚至可以进一步限制它只允许数字作为通配符:

Mobilenumbers.objects.filter(
    column1__regex=r'^98765\d7644$'
)

^$ 分别是开始和结束,用于指定字符串以987... 开头,以...644 结尾。

\d 只匹配数字。所以这意味着最后一个正则表达式将匹配 9876547644,但不匹配 98765a7644

【讨论】:

  • 我可以将它与contains结合使用吗?就像如果98765\d7644 返回所有以\d 替换为98765764433\d 之间的数字的数字,它应该返回所有以33 开头的数字?
  • @SukumarRdjf:您可以省略 ^$ 锚点。例如r'\d' 将返回所有记录的列中包含一个数字。 ^12 返回所有以column1 开头、以12 开头的记录,以此类推
  • 一切看起来都很好,直到我发现它应该搜索 5000 万条记录并且需要太多时间。请问有没有其他办法?
猜你喜欢
  • 1970-01-01
  • 2014-02-11
  • 1970-01-01
  • 2011-08-16
  • 1970-01-01
  • 1970-01-01
  • 2010-11-01
  • 2011-07-10
  • 2012-09-29
相关资源
最近更新 更多