2010-04-03 77 views
3

假設我有一個定義的模型對象'Person',它有一個名爲'Name'的字段。我有一個人名單:我可以使用python列表過濾django模型嗎?

l = ['Bob','Dave','Jane'] 

我想回的所有人員記錄一個列表,其中的第一個名字是在1所定義的名稱列表。

這樣做的最pythonic方式是什麼?

編輯:想到它後,我真正想要做的是拿出一個子列表l 不是存在人表中。有沒有這樣做的有效方式?我可以想到幾種方法,但不確定效率如何。

+0

把「高效」,「正確」和「做我所需要的」放在第一位是可以的。這聽起來很陳詞濫調,但我學習Python越多,似乎是「pythonic」的一個方面。 C的慣例在歷史上被認爲是「正確的」和「高效的」;由於Python構造不太明顯地轉換爲機器翻譯,所以語言一直在改變我優先考慮這兩者的方式。 – msw 2010-04-03 05:13:35

回答

3

重命名l的可讀性:

names = ['Bob','Dave','Jane'] 

Person.objects.[exclude][1](Name__[in][2]=names) 

更新1:回答第二個問題,(在你的 '編輯' 段):

present = Person.objects.values_list('Name', flat=True) 
absent = set(names) - set(present) 
# or, if you prefer named functions to the set operator '-' 
absent = set(names).difference(present) 

是的,「右側」的差異(但沒有t' - ')接受任何可迭代的(我必須look it up來確認)。

+0

這是正確的方法,但使用'Person.objects.values_list('Name',flat = True')'而不是列表理解來獲取名稱列表。 – 2010-04-03 09:03:32

+0

@丹尼爾:謝謝,django新手在這裏 – msw 2010-04-03 14:23:25

+0

@丹尼爾,不知道我明白。你能重寫msw的例子嗎? – Rhubarb 2010-04-04 02:46:29

4

這應該工作:

Person.objects.exclude(name__in=['Bob','Dave','Jane'])

相關問題