가정 해 보겠습니다 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 구조를 개선 할 수 있음을 알고 있습니다. 제 질문에 대해 설명하려고합니다.
시험에서 'exercised_awards_dict'는 무엇입니까? –
죄송합니다. 코드에서 복사했지만 모든 변수 이름을 변경하지 않았습니다. 지금 수정했습니다. – Johan