Django queryset:使用endswith排除电子邮件列表

Ale*_*dre 5 django django-queryset

我正在运行有关用户数据的指标,并希望排除那些包含"@ example.com"或"@ test.com"等虚假电子邮件的用户.

我试过了

emails_to_exclude = ['@example.com', '@test.com', '@mailinator.com' ....]
Users.objects.exclude(email__endswith__in=emails_to_exclude)
Run Code Online (Sandbox Code Playgroud)

不幸的是,这不起作用.看起来endswithin彼此不好玩.有任何想法吗?

Ahs*_*san 14

简单地循环遍历QuerySet,因为QuerySets是惰性的.

emails_to_exclude = ['@example.com', '@test.com', '@mailinator.com' ....]
users = Users.objects
for exclude_email in emails_to_exclude:
    users = users.exclude(email__endswith=exclude_email)
users = users.all()
Run Code Online (Sandbox Code Playgroud)

  • 简单,正确且易于理解.构建这样的查询集是构建复杂搜索工具的一种很好的技术. (2认同)

Zub*_*zal 5

您还可以在单​​个查询中使用正则表达式来执行此操作。

emails_to_exclude = ['@example.com', '@test.com', '@mailinator.com' ....]
User.objects.exclude(email__regex = "|".join(emails_to_exclude))
Run Code Online (Sandbox Code Playgroud)

我不知道这个查询的效率。

这不适用于SQLite,因为它没有内置的正则表达式支持。