Фильтр Django не исключает результаты негативного просмотра регулярного выражения - PullRequest
3 голосов
/ 12 июля 2019

Я работаю над приложением Django, где база данных в настоящее время ищется с использованием регулярных выражений. Возвращенные результаты кажутся правильными, за исключением случаев, когда я ищу с отрицательным прогнозом (я хотел бы иметь возможность исключить некоторые результаты путем фильтрации с помощью регулярного выражения).

Например, в базе данных есть столбец с множеством записей «Нет», и я хотел бы исключить эти результаты при поиске в базе данных. Я попробовал регулярное выражение ^(?!None).*$ в онлайн-тестере регулярных выражений, и оно прошло мои тесты (строки None не совпадают, каждая другая строка). Однако, когда результаты возвращаются с помощью Django, строки «Нет» не исключаются. Бэкэнд для БД - SQLite, который согласно здесь должен позволять все, что разрешено, но я не добился успеха. Вот вызов filter(), который я использую для регулярного выражения:

previousFilters.filter(models.Q(myColumn__regex = r'('+input_expression+')'))

Допускает ли Django исключение результатов через отрицательный взгляд в регулярное выражение?

Ответы [ 2 ]

1 голос
/ 12 июля 2019

Вы можете добавить exclude к вашему запросу, чтобы отфильтровать эти результаты перед выполнением поиска.

previousFilters.exclude(myColumn='None').filter(models.Q(myColumn__regex = r'('+input_expression+')'))

Если они имеют нулевые значения, вы можете исключить такие, как этот

.exclude(myColumn__isnull=True)
1 голос
/ 12 июля 2019

Вместо этого вы можете использовать ^(?:(?!None).)*$, поскольку в SQLite нет встроенной поддержки регулярных выражений и используется модуль python re.

https://docs.djangoproject.com/en/2.2/ref/models/querysets/#regex

In [1]: previousFilters.values_list('title', flat=True)
Out[1]: <QuerySet ['Trackk 1', 'Track 2', 'Track 3', 'None']>

In [2]: previousFilters.filter(title__regex=r'^(?:(?!None).)*$').values_list('title', flat=True)
Out[2]: <QuerySet ['Trackk 1', 'Track 2', 'Track 3']>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...