Django ORM: MyModel.objects.filter(name__iexact__in=[...])



我有一个字符串列表,我想用Django ORM做一个不区分大小写的"in"查找。

我知道,我可以这样做:

name_list = ['Alpha', 'bEtA', 'omegA']
q_list = map(lambda n: Q(name__iexact=n), name_list)
q_list = reduce(lambda a, b: a | b, q_list)
MyModel.objects.filter(q_list)

但也许有一个更简单的解决方案与更现代的 Django ORM ?

IN 运算符(以及除二进制比较之外的其他 MySQL 运算符(默认不区分大小写,除非您更改了表排序规则。在大多数情况下,您可以简单地使用MyModel.objects.filter(name__in=name_list).

请参阅 https://blog.sqlauthority.com/2007/04/30/case-sensitive-sql-query-search/以了解有关排序规则的更多信息。

附言避免像这样使用map-reduce。如果name_list长度足够大,你的整个mysql服务器可能会崩溃。

编辑:

对于PostgreSQL,您可以执行以下操作:MyModel.objects.annotate(name_lower=Lower('name')).filter(name_lower__in=[name.lower() for name in name_list])

最新更新