2013-02-16 60 views
8

我有名字的列表,例如:如何链接Django的“in”和“Iexact”查询集字段查找?

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

目前,我有以下查询集:

MyModel.objects.filter(name__in=name_list) 

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

+1

'in'不能做不区分大小写的,你将不得不遍历每个项目都做'iexact'并使用'Q'对象进行组合。 – Rohan 2013-02-16 06:17:57

回答

16

这里是我的解决方案,它使用Q objects代替:

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) 
+0

+1好的工作,这也不错。我将用它作为将来的参考 – catherine 2013-02-16 07:56:50

+0

我认为Derek的回答非常好,但是我想知道是否可以从django 1.7编写自定义查找来实现相同的目的? https://docs.djangoproject.com/en/1.7/howto/custom-lookups/ – bjw 2014-11-10 21:45:29

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

好吧,我测试它和它的作品:)

+2

'contains'与'exact'匹配不同。 – Rohan 2013-02-16 06:19:26

+2

@Rohan它是“icontains”不是“包含”。如果您完全阅读了Django文档,那么您知道包含和图标之间的区别。 – catherine 2013-02-16 06:43:54

+0

是的,你是对的@cathy但确切'给出了完全匹配,但'包含'给出了结果,如果对象与给定查询中的任何字母匹配,在这种情况下,我们可能会得到不想要的结果:) – kartheek 2013-02-16 06:50:22