2011-01-27 2 views
27

나는 장고의 검색어 필터링 특질이 (?) :장고 objects.filter() values_list()

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] 

또는 "출발 방법"은 파이썬 목록 이해력입니까?

답변

56

시도 l_magazines.values_list('id', flat=True). 그러면 단일 ID 튜플 목록 대신 ID 목록이 반환됩니다. 주의 할

+5

성능 차이가 있습니까? – Marcin

+3

거대한. values_list는 빠릅니다. flat = true를 사용하면 파이썬이 목록의 모든 객체를 인스턴스화 할 필요가 없기 때문에 데이터베이스 값만 반환됩니다. –

+1

이 명확 해지면 Django는 queryset을 queryset의 인수로 사용한다는 것을 인식하므로 두 쿼리를 하나의 쿼리로 결합합니다. 즉, 'values_list'쿼리 세트를 목록으로 평가하지 않습니다! – Anentropic

2

한 가지 값의 동작에 차이가 있다는 것입니다/지능형리스트에서 values_list :

  • 값/필드에 저장된 실제 값을 얻을 것입니다 values_list, 즉, 단지를 id (전체 객체가 아님)
  • 값이 외래 키이고 모델에 적절한 관계가 설정된 경우 목록 이해는 외래 키가 참조하는 객체를 제공합니다.

잘못된 것을 선택하면 수행하려는 작업에 따라 불필요한 데이터베이스 히트 또는 불필요한 faffing이 발생합니다.