如何在 Django ORM 中进行单字符替换( _ )的通配符搜索?

Posted

技术标签:

【中文标题】如何在 Django ORM 中进行单字符替换( _ )的通配符搜索?【英文标题】:How to do wildcard search for single character replacement ( _ ) in 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。 _ 是单个字符。 % 是多个字符。 【参考方案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 万条记录并且需要太多时间。请问有没有其他办法?

以上是关于如何在 Django ORM 中进行单字符替换( _ )的通配符搜索?的主要内容,如果未能解决你的问题,请参考以下文章

python中CSV写入字符串列表,单行变多个单字符的问题?

在使用 ORM 的 Django 中,如何对不同的值进行多个自连接

如何在 django orm 中使用 Annotation 进行嵌套 Group By?

Django ORM 替换额外的 where

MS Access 单字符单元格

测试一个字符是不是是有效的 Julia 单字符变量名?