19

我有一个名字列表,例如:

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

目前我有以下查询集:

MyModel.objects.filter(name__in=name_list)

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

4

3 回答 3

37

这是我的解决方案,它使用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)
于 2013-02-16T07:52:50.350 回答
4
name_list = ['Alpha', 'bEtA', 'omegA']
results = MyModel.objects.none()
for name in name_list:
    results |= MyModel.objects.filter(name__iexact=name)

好的,我测试它并且它有效:)

于 2013-02-16T06:16:26.957 回答
1

这是一个使用列表推导的示例。它类似于凯瑟琳的回答,但有一个数据库命中,如 Derek Kwok 的回答(但程序性而不是功能性)。

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、ma​​p、reduce 等的人。

于 2020-07-14T22:24:35.797 回答