2011-01-27 57 views
27

我有一個怪癖Django的查詢集過濾(?):Django的objects.filter()values_list()與Python列表修真__in查詢

ipdb> MagazineIssue.objects.filter(id__in=l_magazines.values_list('id')) 
Out[0]: [] 

ipdb> MagazineIssue.objects.filter(id__in=[l_magazine.id for l_magazine in l_magazines]) 
Out[0]: [<MagazineIssue: Architecture Australia, Jan 1995 (#1)>] 

ipdb> l_magazines.values_list('id') 
Out[0]: [(1,)] 
ipdb> [l_magazine.id for l_magazine in l_magazines] 
Out[0]: [1] 

那麼,如何使用values_list()? (生產):

[1] 

或者是python list comprehension的「路要走」嗎?

回答

56

嘗試l_magazines.values_list('id', flat=True)。這將返回一個id列表,而不是單個id元組列表。

+5

是否有性能差異? – Marcin 2011-06-04 10:55:44

2

有一點要注意的是,有價值觀的行爲差異/從列表理解values_list:

  • 值/ values_list將產生存儲在現場的實際值,即,只是如果該值是一個外鍵,並且在模型中建立了適當的關係,則列表理解將爲您提供由外鍵引用的對象。

選擇錯誤的一個將導致不必要的數據庫命中或不必要的拖延,具體取決於您正在嘗試執行的操作。