У меня есть модель:Джанго регулярное выражение в поле
class M(Model):
re = CharacterField(max_length=50, blank=true)
Например, в таблице у меня есть:
table m
----------------
| id | re |
----------------
| 1 | \d+ |
| 2 | \:abc |
----------------
Я хочу, чтобы найти какой-то объект, который будет соответствовать моей входной строки (inp
) с помощью регулярных выражений хранятся в 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» с некоторым выражением?
'iregex' работает в прямом направлении - когда столбцу в таблице согласовано с некоторым регулярным выражением, мне нужно реверсировать операцию - какое-то значение для регулярных выражений согласованнога в столбце. Я попробовал 'M.objects.filter (re__iregex =" 123 "). First()' и он возвращает 'None', но должен возвращать' 1', потому что '123' соответствует под' \ d + ' – user3479125
взгляните на мое редактирование –
спасибо, это интересное и информативное решение, один вопрос: будет ли он сначала выбрать все из db, а затем найти совпадающий объект в python? Моя цель - выполнить регулярное совпадение на сервере БД (я думаю, что выборка всех исходных данных с сервера БД будет неэффективной, если в таблице будет много строк). Кажется, что django не имеет такого фильтра, поэтому мне нужно применить некоторые дополнительные условия к 'where', что-то вроде' 'WHERE {} REGEXP m.re'.format (inp)', я попробую его позже. – user3479125