我有模特:
class M(Model):
re = CharacterField(max_length=50, blank=true)
例如,在表格中我有:
table m
----------------
| id | re |
----------------
| 1 | \d+ |
| 2 | \:abc |
----------------
我想通过存储在inp
字段中的regexp找到一些与我的输入字符串(re
)匹配的对象,参见示例:
inp = ":abc"
for m in M.objects.all():
if re.match(m.re, inp)
print("{} matched".format(m.id)) # 2 matched
但是可以在数据库服务器上执行match
吗?所以用一些表达式将.all()
替换为'.filter'?
答案 0 :(得分:2)
对于正则表达式匹配,您需要在content-noen.php
调用中的字段名后使用__iregex
:
filter
查看official documentation以获取更多信息
编辑
如果您想要反向操作(检查数据库中保存的任何正则表达式是否与您的值匹配),您不能使用简单 M.objects.filter(re__iregex=inp)
,但可以定义自定义Manager
filter
另请查看此question。
答案 1 :(得分:2)
首先,MySQL不处理\d
。请改用[0-9]
或[[:digit:]]
。
其次,要在SQL中执行regexp,请构建应用
'[0-9]+|:abc'
然后将其构建到查询中。
但你可能想要锚定正则表达式:
'^([0-9]+|:abc)$'
答案 2 :(得分:1)
for m in M.objects.filter().extra(where=["'{}' RLIKE `m`.`re`".format(inp)])
print("{} matched".format(m.id))