TheLifeOfSteve
TheLifeOfSteve

Reputation: 3288

annotate() adding more than needed

I'm having a small issue with my annotate(sum()) function. Now what I want it to do is show a total for all maturities in the given plan, inside the list. Which for the first one it does. Code below:

#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,
            })

My only issue now, is that when it goes to the next plan, it continues to add to the grand total, instead of going back to 0.

Am I missing something?

Any help would be appreciated.

Thanks

Upvotes: 0

Views: 224

Answers (1)

Chris Pratt
Chris Pratt

Reputation: 239290

You're using += with the total_m* vars but never resetting them to 0 in your loop. They don't automatically reset, just because a new iteration has started.

FWIW, you should try to optimize your code here. You're generating 6*len(plans) queries, which could be rather costly.

Upvotes: 1

Related Questions