Django 过滤 iexact 列表

Posted

技术标签:

【中文标题】Django 过滤 iexact 列表【英文标题】:Django filter iexact on a list 【发布时间】:2016-03-04 13:01:57 【问题描述】:

我有一个这样设置的用户模型。

class ExternalUserModel(models.Model):
    email = models.EmailField()
    # other fields

class MyUserModel(models.Model):
    external_user = models.ForeignKey(ExternalUserModel)
    # other fields

我正在尝试从电子邮件列表中获取 MyUserModel 列表。

这是我要执行的查询:

MyUserModel.objects.filter(external_user__email__iexact__in=user_emails)

但是我收到了这个错误: Unsupported lookup 'iexact' for EmailField or join on the field not permitted.

我需要 iexact,因为电子邮件列表基于用户输入,可能与存储在数据库中的大小写不匹配。

我应该如何进行这个查询?

【问题讨论】:

【参考方案1】:

Django ORM 不直接支持。我不认为数据库后端也这样做。您可以通过组合多个 __iexact 过滤器来获得所需的结果,如此处的各种答案所示:How to dynamically compose an OR query filter in Django?

在此处显示的选项中,我更喜欢 reduce(operator.or_, ...) 语法而不是 for 循环,但这是个人偏好。

【讨论】:

谢谢! query = reduce(operator.or_, (Q(external_user__email__iexact=x) for x in user_emails)) MyUserModel.objects.filter(query) 成功了!【参考方案2】:

电子邮件必须是完整的,因此,它应该是准确的,您不需要使用__iexact 查找。你只需要:

MyUserModel.objects.filter(external_user__email__in=user_emails)

【讨论】:

这里会考虑大小写,即email@example.comEmail@example.com不同

以上是关于Django 过滤 iexact 列表的主要内容,如果未能解决你的问题,请参考以下文章

django - 通过过滤对象列表获取对象列表

Django:遍历模板中的过滤列表

Django 清除所有管理员列表过滤器

Django 多对多字段过滤器列表

Django按模型对象列表过滤

Django 根据列表值过滤对象