python - 即使过滤条件不匹配,带有 iregex 的 Django 查询集过滤器也会返回所有对象
问题描述
我需要查询数据库以获取基于不区分大小写的电子邮件正则表达式搜索的用户列表。
User.objects.filter(email__iregex=f'({"|".join(emails)})')
这里的 emails 是一个包含用户电子邮件 ID 的列表。当 emails 是一个空列表时,上面会返回数据库中的所有用户。我无法弄清楚为什么会这样?理想情况下,当 emails 是空列表时,应该返回空查询集。有人可以告诉我上面的代码有什么问题吗?
解决方案
这是完全正常的,因为正则表达式没有开始/开始锚点,因此空的正则表达式匹配一切。您可以添加锚点^
(开始锚点)和$
(结束锚点),例如:
User.objects.filter(email__iregex=f'^({'|'.join(emails)})$')
但问题仍然没有完全解决。如果电子邮件地址包含一个点 ( .
) 表示“匹配任何字符”),如果它包含一个问号 ( ?
),它将被解释为可选部分。re.escape(…)
您可以使用[python-doc]转义这些:
from re import escape as rescape
escaped_emails = '|'.join(map(rescape, emails))
User.objects.filter(email__iregex=f'^({escaped_emails})$')
推荐阅读
- python - Python Google 翻译文本时出现错误,ConnectionError: HTTPSConnectionPool(host='translate.google.com', port=443)
- java - android数据绑定编码问题
- java - CVE-2018-14667;为 RichFaces 3.X 生成有效载荷
- c - 关闭linux系统的C函数
- javascript - 提交表单jsp后关闭窗口
- rxjs - 如何将 RXJS Observable 流分成相等的 N 个大小的数组?
- java - 给定一堆整数,请仅使用加号运算输出所有可能数字的所有组合
- amazon-web-services - 跨账户访问的 AWS S3 存储桶控制策略
- angular - 如何在 Angular 6 中使用 ngTagsInput?
- sql - 基于另一个表中提供的列名构建查询