我有模特:
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但是在DB服务器上执行match是可能的吗?所以用一些表达式将.all()替换为'.filter‘?
发布于 2016-02-22 15:30:30
for m in M.objects.filter().extra(where=["'{}' RLIKE `m`.`re`".format(inp)])
print("{} matched".format(m.id))发布于 2016-02-19 14:27:55
对于正则表达式匹配,需要在__iregex调用中在字段名之后使用filter:
M.objects.filter(re__iregex=inp)查看正式文件以获取更多信息
编辑
如果您想要反向操作(检查保存在数据库中的任何regex是否与您的值匹配),您不能使用简单的filter,但可以定义自定义的经理。
class CurrentManager(models.Manager):
def match(self, value):
objects = super(CurrentManager, self).get_query_set().all()
#here your code
objects = [o for o in objects if re.match(o, value)]
return objects
class M(Model):
re = CharacterField(max_length=50, blank=true)
objects = RegexManager()
#usage
matched = M.objects.match('123')也请看一下这个问题。
发布于 2016-02-19 17:44:35
首先,\d不是由MySQL处理的。使用[0-9]或[[:digit:]]。
其次,要在SQL中执行regexp,请让您的app构造。
'[0-9]+|:abc'然后将其构建到查询中。
但是您可能想锚定regexp:
'^([0-9]+|:abc)$'https://stackoverflow.com/questions/35506944
复制相似问题