2017-05-24 78 views
1

我們有一個鍵值數據存儲,按以下型號定義計算要實現的是獲得給定的「人員」列表,該程序至少給出一個結果並在程序級別進行計數。Django的查詢集優化從一個表彙總並從另一個表

就目前而言,我所做的是以下幾點:

def my_function(given_group): 
    persons = Person.objects.filter(group=given_group) 
    programs = Program.objects.all() 

    given_results = {} 
    for program in programs : 
     given_results[program.name] = 0 

     for person in persons : 
      # if the program gave at least one result to the person 
      if Result.objects.filter(program=program, person=person).exists() : 
       given_results[program.name] += 1 
      else: 
       continue 

    return given_results 

那就是做(2秒的思想),但最簡單的方法,如果我的given_group包含的人一萬元,這是一個可怕的方式來做到這一點。

是來到我的腦海其他解決方案是使用select_related/prefetch_related,但我想不出如何與存在使用它們()或極限等[1]

沒有任何人有一個很好的建議在幾乎沒有要求的情況下達到相同的結果?

SOLUTION

丹尼爾的回答讓我在正確的軌道上,所以這裏是解決方案:

given_results = Result.objects.filter(person__group=given_group).values('program__program_name').annotate(total=Count('person', distinct=True)) 

回答

0

你不希望在所有查詢相關的表,因爲你不實際上並不需要這些數據。你想要的是一個統計數值的聚合。所以:

from django.db.models import Count 
given_results = ResultValue.objects.filter(person=person).values('program__name').annotate(total=Count('*')) 

這使你在表單{'program__name': 'foo', 'total': 100000}類型的字典清單,但它相當瑣碎將其轉換成一個單一的字典,如果這就是你所需要的。

+0

幾乎就是這樣,事實上問題不在於「該計劃提供了多少結果?」但是「該計劃提供了多少次結果?」所以如果一個程序給出了1個人的10個結果,我想把它計爲1。 –

相關問題