【问题标题】:Django queryset filter with iregex returns all objects even if filter condition is not matched即使过滤条件不匹配,带有 iregex 的 Django 查询集过滤器也会返回所有对象
【发布时间】:2021-01-20 08:30:09
【问题描述】:

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

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

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

【问题讨论】:

  • 这是完全正常的,因为正则表达式没有开始/开始锚点,因此一个空的正则表达式匹配 everything

标签: python django django-models


【解决方案1】:

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

User.objects.filter(email__iregex=f'<b>^</b>({'|'.join(emails)})<b>$</b>')

但问题仍然没有完全解决。如果电子邮件地址包含一个点(.),表示“匹配任何字符”),如果它包含一个问号(?),它将被解释为可选部分。您可以使用re.escape(…) [python-doc] 转义这些:

from re import escape as rescape

escaped_emails = '|'.join(map(rescape, emails))
User.objects.filter(email__iregex=f'^({escaped_emails})$')

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-12-05
    • 2020-02-12
    • 2020-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-08
    相关资源
    最近更新 更多