如何链接Django的“in”和“iexact”查询集字段查找?

7rtdyuoh  于 2023-02-14  发布在  Go
关注(0)|答案(4)|浏览(141)

我有一份名单,例如:

name_list = ['Alpha', 'bEtA', 'omegA']

目前我有以下查询集:

MyModel.objects.filter(name__in=name_list)

我希望能够以不区分大小写的方式过滤名称。我的第一个想法是使用iexact字段查找,但它似乎不适用于in。我如何将iexactin字段查找一起用于我的查询集?或者是否有替代方法来执行此查询?

lsmd5eda

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)
a64a0gku

a64a0gku2#

name_list = ['Alpha', 'bEtA', 'omegA']
results = MyModel.objects.none()
for name in name_list:
    results |= MyModel.objects.filter(name__iexact=name)

好的,我测试一下,效果很好:)

yh2wf1be

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等的人。

erhoui1w

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)

相关问题