2013-10-31 81 views
1

我想獲取某些對象的ID。什麼是讓他們成爲元組的乾淨方式?獲取字段查詢值的元組

一個.values()查詢集返回此:

MyModel.objects.filter(name__startwith='A').values('id') 
>>>> [{'id': 20L}, {'id': 21L}, {'id': 84L}] 

,我想變換/讓他們到像一個元組:

(20L, 21L, 84L) 

回答

4

最簡單的解決方案是ge噸values_listflat=True

models.MyModel.objects.all().values_list('id', flat=True) 

這類似於值()除了代替返回字典,當遍歷它返回的元組。每個元組包含傳遞給values_list()調用的相應字段的值 - 因此第一個項目是第一個字段等。

如果您只傳入單個字段,則還可以傳遞flat參數。如果爲True,這將意味着返回的結果是單個值,而不是一元組。一個例子應該使差異更清晰:

+0

謝謝它看起來不錯,但它不適用於MySQL(錯誤提出:「此版本的MySQL尚不支持'LIMIT&IN/ALL/ANY/SOME子查詢'「) – bux

+0

你的問題沒有這個限制,對不起 – oleg

+0

你說得對,我搞錯了:p – bux

2

什麼發電機體現在哪裏?

tuple(d['id'] for d in MyModel.objects.filter(name__startwith='A').values('id')) 

或者:

import operator 
tuple(map(lambda x: operator.getitem(x, 'id'), MyModel.objects.filter(name__startwith='A').values('id')) 

或者,因爲這是出於某種原因刪除的回答表明,你可以這樣做:

tuple(object.id for object in MyModel.objects.filter(name__startwith='A')) 

或者:

import operator 
getter = operator.attrgetter('id') 
tpl = tuple(map(getter, MyModel.objects.filter(name__startwith='A')))