2016-08-16 3 views
2

가정 해 보겠습니다 I가입이 개 검색어 세트

class Award(models.Model): 
    user = models.ForeignKey(User) 


class AwardReceived(models.Model): 
    award = models.ForeignKey(award) 
    date = models.DateField() 
    units = models.IntegerField() 


class AwardUsed(models.Model): 
    award = models.ForeignKey(award) 
    date = models.DateField() 
    units = models.IntegerField() 
이제

는 가정 다음 모델은 내가 모든 사용자에 대한 상의 수와 모든 사용자 (즉,의 검색어가 포함 된 사용 상의 수를 얻으려면이 양자 모두). 각 계산마다 하나의 쿼리를 사용하는 것을 선호합니다. 코드를 결합하여 예상치 못한 결과가 발생했습니다. 또한 일부 쿼리에 대해서는 쿼리가 너무 복잡해지기 때문에 하나의 쿼리를 수행 할 수 없습니다. 8 필드를 계산합니다. 이것은 지금까지 어떻게 해결 했는가입니다 :

def get_summary(query_date) 
    summary = (Award.objects.filter(awardreceived__date__lte=query_date)) 
        .annotate(awarded=Sum('awardissuedactivity__units_awarded'))) 

    awards_used = (Award.objects.filter(awardused__date__lte=query_date) 
         .annotate(used=Sum('awardused__date__lte__units'))) 

    award_used_dict = {} 
    for award in awards_used: 
     award_used_dict[award] = award.used 

    for award in summary: 
     award.used = award_used_dict.get(award, 0) 

    return summary 

사전 접근없이 이것을 해결할 수있는 방법이있을 것이라고 확신합니까? 예를 들어, 다음과 같은 것 : awards_used.get(award=award)하지만 이것은 모든 루프에서 db lookup을 야기합니다.

또는 일부 다른 멋진 방법은 querysets 가입?

참고 :이 예제는 단순화 된 것으로,이 예제에서는 DB 구조를 개선 할 수 있음을 알고 있습니다. 제 질문에 대해 설명하려고합니다.

+0

시험에서 'exercised_awards_dict'는 무엇입니까? –

+0

죄송합니다. 코드에서 복사했지만 모든 변수 이름을 변경하지 않았습니다. 지금 수정했습니다. – Johan

답변

5

해결 한

는 그냥 예를 업데이트]

final_q = summary | awards_used 

에서 |

final_q = q1 | q2 

를 사용하여 검색어 세트를 연결하는 시도 :

| 계산 된 속성을 사용하는 작업은, 그래서, 우리는

summary = Award.objects.filter(awardreceived__date__lte=query_date) 
awards_used = Award.objects.filter(awardused__date__lte=query_date) 
final_q = summary | awards_used 

final_q = final_q.annotate(used=Sum('awardused__date__lte__units')).annotate(awarded=Sum('awardissuedactivity__units_awarded')) 

해결이

사용하여 우리의 추가 속성이 체인 내장 함수

from itertools import chain 
final_list = list(chain(summary, awards_used)) 

매핑 먼저하고 우리의 검색어를 선택할 수 없습니다 이 접근법에 대한 문제이므로 쿼리 세트를 얻지 못할 경우 인스턴스가 포함 된 목록을 얻을 수 있습니다.

+0

final_q [0] .used를 사용하면 속성 오류가 발생합니다. 마치 계산 된 값이 포함되지 않은 것과 같습니다. – Johan

+0

@Johan 나는 나의 대답을 업데이트했다 – levi

+0

큰 감사, I 'll 시도. 목록 가져 오는 것을 꺼리지 마십시오. – Johan