Использование аннотации в списке - PullRequest
1 голос
/ 01 ноября 2011

В настоящее время у меня есть представление, которое показывает все мои инвестиции со сроком погашения в течение следующих 5 лет для каждого клиента.То, что я хотел бы сделать, это показать итоговую сумму для каждого финансового учреждения, отображаемую как:

Institution |Сумма |Сумма погашения

TD |1000 |1250
Шотландия |1203 |9383

и т. Д.

Это мой код, показывающий инвестиции в сроки погашения на следующие 5 лет.

#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

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

Я использую список для хранения всех своих планов, чтобы я мог запустить цикл for для каждого плана в моем шаблоне.

У меня есть аналогичное представление, которое делает то, что я хочу, чтобы это сделал, но только для одного плана, и я не уверен, как заставить его работать с несколькими планами.

Вот мойкод, если это всего лишь один выбранный план.

#Calculate the holding totals with each company
        total_list = plan.investment_set.filter(maturity_date__gte= '%s-1-1' % current_year).values('financial_institution__abbr').annotate(Sum('maturity_amount')).order_by('financial_institution__abbr')
        context['list'] = total_list

Если кто-то может помочь, это будет высоко ценится.

Спасибо.

1 Ответ

0 голосов
/ 01 ноября 2011

Похоже, вы могли бы заставить свою базу данных рассчитать это для вас.

В SQL это может выглядеть примерно так:

SELECT sum(investment.amount)
FROM investment, maturity_date
WHERE investment.id = maturity_date.investment_id and year=%s
GROUP BY investment.amount

Взгляните на Джангодокументацию для агрегации и посмотрите, подходит ли ваша проблема.

В дополнение к этому, api queryset Django имеет значение generative , так что вы можете упростить построение вашего запроса:

investments = Investment.objects.all().filter(plan = p).order_by('financial_institution')
cur_inv = investments.filter(maturity_date__year = current_year)
nxt_inv = investments.filter(maturity_date__year = next_yr)
thr_inv = investments.filter(maturity_date__year = thr_yr)
fr_inv = investments.filter(maturity_date__year = fr_yr)
fv_inv = investments.filter(maturity_date__year = fv_yr)

РЕДАКТИРОВАТЬ: Я не пробовал это сам, но эта часть документации агрегации выглядит хорошим началом.

...