Django 过滤器不排除否定前瞻正则表达式的结果
Django filter does not exclude results of negative look ahead regex
我正在开发一个 Django 应用程序,目前正在使用正则表达式搜索数据库。返回的结果似乎是正确的,除了当我用负面前瞻搜索时(我希望能够通过使用正则表达式过滤来排除一些结果)。
例如,数据库中有一个列有很多'None'的条目,我想在搜索数据库时排除这些结果。我在在线正则表达式测试器中尝试了正则表达式 ^(?!None).*$
,它通过了我的测试('None' 字符串不匹配,其他所有字符串都匹配)。但是,当使用 Django 返回结果时,不会排除 'None' 行。数据库的后端是 SQLite,根据 here 应该允许任何 re 允许,但我没有成功。这是我用于正则表达式的 filter()
调用:
previousFilters.filter(models.Q(myColumn__regex = r'('+input_expression+')'))
Django 是否允许通过正则表达式中的否定预测排除结果?
您可以改用 ^(?:(?!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']>
您可以在查询中添加 exclude
以在执行搜索之前过滤掉这些结果
previousFilters.exclude(myColumn='None').filter(models.Q(myColumn__regex = r'('+input_expression+')'))
如果它们是空值,您可以像这样排除那些
.exclude(myColumn__isnull=True)
我正在开发一个 Django 应用程序,目前正在使用正则表达式搜索数据库。返回的结果似乎是正确的,除了当我用负面前瞻搜索时(我希望能够通过使用正则表达式过滤来排除一些结果)。
例如,数据库中有一个列有很多'None'的条目,我想在搜索数据库时排除这些结果。我在在线正则表达式测试器中尝试了正则表达式 ^(?!None).*$
,它通过了我的测试('None' 字符串不匹配,其他所有字符串都匹配)。但是,当使用 Django 返回结果时,不会排除 'None' 行。数据库的后端是 SQLite,根据 here 应该允许任何 re 允许,但我没有成功。这是我用于正则表达式的 filter()
调用:
previousFilters.filter(models.Q(myColumn__regex = r'('+input_expression+')'))
Django 是否允许通过正则表达式中的否定预测排除结果?
您可以改用 ^(?:(?!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']>
您可以在查询中添加 exclude
以在执行搜索之前过滤掉这些结果
previousFilters.exclude(myColumn='None').filter(models.Q(myColumn__regex = r'('+input_expression+')'))
如果它们是空值,您可以像这样排除那些
.exclude(myColumn__isnull=True)