Django 在列表上过滤 iexact

Ice*_*ele 9 python django django-queryset

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

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

class MyUserModel(models.Model):
    external_user = models.ForeignKey(ExternalUserModel)
    # other fields
Run Code Online (Sandbox Code Playgroud)

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

这是我要执行的查询:

MyUserModel.objects.filter(external_user__email__iexact__in=user_emails)
Run Code Online (Sandbox Code Playgroud)

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

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

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

Pet*_*per 9

Django ORM 并不直接支持这一点。我认为数据库后端也不会这样做。您可以通过组合多个过滤器来获得您正在寻找的结果,__iexact如此处的各种答案所示:如何在 Django 中动态组合 OR 查询过滤器?

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

  • 谢谢!`query = reduce(operator.or_, (Q(external_user__email__iexact=x) for x in user_emails))` `MyUserModel.objects.filter(query)` 成功了! (4认同)