首页 > 解决方案 > 即使过滤条件不匹配,带有 iregex 的 Django 查询集过滤器也会返回所有对象

问题描述

我需要查询数据库以获取基于不区分大小写的电子邮件正则表达式搜索的用户列表。

User.objects.filter(email__iregex=f'({"|".join(emails)})')

这里的 emails 是一个包含用户电子邮件 ID 的列表。当 emails 是一个空列表时,上面会返回数据库中的所有用户。我无法弄清楚为什么会这样?理想情况下,当 emails 是空列表时,应该返回空查询集。有人可以告诉我上面的代码有什么问题吗?

标签: pythondjangodjango-models

解决方案


这是完全正常的,因为正则表达式没有开始/开始锚点,因此空的正则表达式匹配一切。您可以添加锚点^(开始锚点)和$(结束锚点),例如:

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})$')

推荐阅读