2017-05-24 8 views
1

다른 테이블에서 계산 달성하기 위해서는 'Person'의 주어진 목록을 얻는 것, 적어도 하나의 결과를 제공하고 프로그램 수준에서 계산하는 프로그램. 순간 장고의 검색어 최적화 한 테이블의 집계는 다음과 같은 모델에 의해 정의 우리는 키와 값의 데이터 저장소를

, 무슨 내가 한 것은 다음 내 given_group이 사람의 백만이 포함 된 경우

그것 (2 초 생각)하지만 작업을 수행하는 가장 쉬운 방법입니다
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 

, 즉에 끔찍한 방법입니다 해.

내 마음에 온 다른 솔루션은 select_related/prefetch_related 사용하는 것입니다하지만 난 존재로 (이를 사용하는 방법을 알아낼) 또는 LIMIT 상당 수 없습니다 [1]

이 사람이 좋은이 있습니까 몇 가지 요청으로 동일한 결과를 얻으려는 제안? 당신은 전혀 관련 테이블을 쿼리하지 않으

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}에서 dicts의 목록을 제공

,하지만 그건 당신이 필요하다면 하나의 DICT에 그 변환하는 매우 사소한.

+0

거의 그게 사실입니다. '프로그램에 얼마나 많은 결과가 있습니까?' '프로그램이 몇 번이나 결과를 냈습니까?' 그래서 한 프로그램이 10 명의 결과를 한 사람에게 주면 나는 1로 계산하고 싶습니다. –