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