annotate()添加超过需要

时间:2011-11-01 16:41:18

标签: python django django-views annotate

我的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.

我错过了什么吗?

任何帮助都将不胜感激。

由于

1 个答案:

答案 0 :(得分:1)

您将+=total_m* vars一起使用,但从未在循环中将其重置为0。它们不会自动重置,只是因为新的迭代已经开始。

FWIW,你应该尝试在这里优化你的代码。你正在生成6 * len(计划)查询,这可能相当昂贵。