2012-03-01 16 views
2

私はクエリーセットのフィルタされたバリエーションを取得するために一連のクエリを作成しています。私がDBに6回ぶつかるのではなく、代わりに最初の呼び出しを使用するより簡単な方法がありますか?Djangoでのクエリの結合

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

その後、あなたは追加のDBクエリせずにページの他のタイプを取得することができます:あなたはすべてのページを取得している場合

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

# 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())をフェッチしないと、追加のクエリを実行せずに最初のフェッチセットに含まれていない追加データを取得することはできません。

関連する問題