2013-10-31 3 views
1

일부 객체의 ID를 가져 오려고합니다. 튜플에 넣을 수있는 확실한 방법은 무엇입니까?필드 질의 값의 튜플을 얻는다

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

을 그리고 난 같은 튜플로를/변환 얻을 싶습니다 :

의 .values ​​()이 반환의 검색어 무엇 발전기 표현에 대한

(20L, 21L, 84L) 

답변

4

가장 간단한 해결책은 ge이다. 이상 반복 할 때 flat=True

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

이 대신 사전을 반환하는 것을 제외하고 값()과 유사하다와 t values_list, 그것은 튜플을 반환합니다. 각 튜플에는 values_list() 호출로 전달 된 각 필드의 값이 들어 있으므로 첫 번째 항목이 첫 번째 필드가됩니다.

단일 필드 만 전달하면 flat 매개 변수를 전달할 수도 있습니다. 참이면 반환 된 결과가 단일 튜플이 아닌 단일 값임을 의미합니다. 예를 들어 차이를 명확하게해야합니다 :

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