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)