2012-03-01 2 views
2

일련의 검색어를 만들어 쿼리 세트의 필터링 된 변형을 가져오고 있습니다. 거기에 내가 DB를 6 번 치는 대신 초기 호출을 사용하는 간단한 방법이 있나요?장고에서 검색어 결합

data['os']['today'] = Page.objects.all() 
data['os']['pro'] = Page.objects.filter(premium_plan=PlanType.PRO).count() 
data['os']['yesterday'] = Page.objects.filter(created__lt=within_last_day).count() 
data['os']['week'] = Page.objects.filter(created__lt=within_last_week).count() 
data['os']['new_pro'] = Page.objects.filter(upgrade__cancelled_date__isnull=True, upgrade__activated_date=within_last_day) 
data['os']['new_top_pages'] = Page.objects.filter(created__gt=within_last_day).extra(select={'total_fans':'facebook_count + twitter_count'}, order_by=('-total_fans',))[:10] 

답변

0

당신은 모든 페이지를 받고있는 경우 : 그럼 당신은 추가 DB 쿼리하지 않고 페이지의 다른 유형을 가져 오는 수

pages = Page.objects.all() # Page.objects.select_related() if we want filtering on related objects fields 

을 :

# it will not call the database 
data['os']['yesterday'] = pages.filter(created__lt=within_last_day).count() 
data['os']['week'] = pages.filter(created__lt=within_last_week).count() 
... 

당신은 필터 방법을 통해 페이지를 얻을 경우 필터에 대한 후속 호출은 첫 번째 페칭 세트에서 작동합니다.

pages = Page.objects.filter(id__in=(1,2,3)) # we have pages in db with ids in 1,2,3,4,5 
pages_additional = pages.filter(condition) #Here we are working with objects with ids 1,2,3 

처음에 모든 레코드 (Page.objects.all())를 가져 오지 않으면 추가 쿼리없이 첫 번째 페칭 세트에 포함되지 않은 추가 데이터를 얻을 수 없습니다.