我有一份名单,例如:
name_list = ['Alpha', 'bEtA', 'omegA']
目前我有以下查询集:
MyModel.objects.filter(name__in=name_list)
我希望能够以不区分大小写的方式过滤名称。我的第一个想法是使用iexact字段查找,但它似乎不适用于in。我如何将iexact与in字段查找一起用于我的查询集?或者是否有替代方法来执行此查询?
iexact
in
lsmd5eda1#
下面是我的解决方案,它使用了Q对象:
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)
a64a0gku2#
name_list = ['Alpha', 'bEtA', 'omegA'] results = MyModel.objects.none() for name in name_list: results |= MyModel.objects.filter(name__iexact=name)
好的,我测试一下,效果很好:)
yh2wf1be3#
下面是一个使用列表解析的例子,它类似于catherine的answer,但是有一个数据库命中,类似于Derek Kwok的answer(但是是过程性的而不是函数性的)。
q_list = Q() for q in [Q(name__iexact=n) for n in name_list]: q_list |= q MyModel.objects.filter(q_list)
对于那些喜欢在Python中避免zip、map、reduce等的人。
erhoui1w4#
用转换后的名称小写注解目标记录怎么样?应该会大大减少所需的条件数量,提高性能...
from django.db.models.functions import Lower lcase_name_list = [x.lower() for x in name_list] MyModel.objects.annotate(lcase_name=Lower('name').filter(lcase_name__in=lcase_name_list)
4条答案
按热度按时间lsmd5eda1#
下面是我的解决方案,它使用了Q对象:
a64a0gku2#
好的,我测试一下,效果很好:)
yh2wf1be3#
下面是一个使用列表解析的例子,它类似于catherine的answer,但是有一个数据库命中,类似于Derek Kwok的answer(但是是过程性的而不是函数性的)。
对于那些喜欢在Python中避免zip、map、reduce等的人。
erhoui1w4#
用转换后的名称小写注解目标记录怎么样?应该会大大减少所需的条件数量,提高性能...