我有一个字符串列表,我想用Django ORM进行不区分大小写的“在”查找。

我知道,我可以这样做:

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/以了解有关整理的更多信息。

P.S. 避免像这样使用map-reduce。如果name_list的长度足够大,则整个mysql服务器都可以关闭。

编辑:

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

关于django-orm - Django ORM : MyModel. objects.filter(name__iexact__in = […]),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50946635/

10-13 09:06