2013-02-16 59 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