annotate () добавляет больше, чем нужно - PullRequest
0 голосов
/ 01 ноября 2011

У меня небольшая проблема с моей функцией annotate (sum ()).Теперь я хочу показать итоги всех сроков погашения по данному плану внутри списка.Что для первого это делает.Код ниже:

#get the invesments maturing this year
        for p in plans:
            cur_inv = Investment.objects.all().filter(plan = p).order_by('financial_institution').filter(maturity_date__year = current_year)
            nxt_inv = Investment.objects.all().filter(plan = p).order_by('financial_institution').filter(maturity_date__year = next_yr)
            thr_inv = Investment.objects.all().filter(plan = p).order_by('financial_institution').filter(maturity_date__year = thr_yr)
            fr_inv = Investment.objects.all().filter(plan = p).order_by('financial_institution').filter(maturity_date__year = fr_yr)
            fv_inv = Investment.objects.all().filter(plan = p).order_by('financial_institution').filter(maturity_date__year = fv_yr)

            for inv in cur_inv:
                total += inv.amount or 0
            for inv in cur_inv:
                total_m += inv.maturity_amount or 0

            for inv in nxt_inv:
                total2 += inv.amount or 0
            for inv in nxt_inv:
                total_m2 += inv.maturity_amount or 0

            for inv in thr_inv:
                total3 += inv.amount or 0
            for inv in thr_inv:
                total_m3 += inv.maturity_amount or 0

            for inv in fr_inv:
                total4 += inv.amount or 0
            for inv in fr_inv:
                total_m4 += inv.maturity_amount or 0

            for inv in fv_inv:
                total5 += inv.amount or 0
            for inv in fv_inv:
                total_m5 += inv.maturity_amount or 0

#Calculate the holding totals with each company
            total_list = p.investment_set.filter(maturity_date__gte= '%s-1-1' % current_year).values('financial_institution__abbr').annotate(Sum('maturity_amount')).order_by('financial_institution__abbr')
            gtotal = total_m + total_m2 + total_m3 + total_m4 + total_m5

            plan_list.append({
                'plan':p,
                'investment': cur_inv,
                'nxt_inv': nxt_inv,
                'thr_inv': thr_inv,
                'fr_inv': fr_inv,
                'fv_inv': fv_inv,
                'total_list': total_list,
                'grand': gtotal,
            })

Моя единственная проблема сейчас заключается в том, что при переходе к следующему плану он продолжает добавляться к общему итогу, а не возвращается к 0.

AmЯ что-то пропустил?

Любая помощь будет оценена.

Спасибо

1 Ответ

1 голос
/ 01 ноября 2011

Вы используете += с total_m* переменными, но никогда не сбрасываете их на 0 в цикле.Они не сбрасываются автоматически, просто потому, что началась новая итерация.

FWIW, вы должны попытаться оптимизировать свой код здесь.Вы генерируете 6 * len (планов) запросов, которые могут быть довольно дорогостоящими.

...