Как я могу использовать диапазон дат с Sum и Order By в Django

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

Ниже приведено то, что я пробовал, но я получаю ошибку, которая говорит, что слишком много значений для распаковки (ожидалось 2).

Код модели:

CATEGORY_INCOME = (
('Photocopy', 'Photocopy'),
('Type & Print', 'Type & Print'),
('Normal Print', 'Normal Print'),
('Color Print', 'Color Print'),
('Passport', 'Passport'),
('Graphic Design', 'Graphic Design'),
('Admission Check', 'Admission Check'),
('Lamination', 'Lamination'),
('Document Scan', 'Document Scan'),
('Email Creation', 'Email Creation'),
('Email Check', 'Email Check'),
('Online Application', 'Online Application'),
('Agreement Form', 'Agreement Form'),
('Envelope / Binding Film', 'Envelope / Binding Film'),
('Web Development ', 'Web Development'),
)

class Income(models.Model): 
    description = models.CharField(max_length=100, choices=CATEGORY_INCOME, null=True)
    staff = models.ForeignKey(User, on_delete=models.CASCADE, null=True)
    amount = models.PositiveIntegerField(null=False)
    date = models.DateField(auto_now_add=False, auto_now=False, null=False)
    addedDate = models.DateTimeField(auto_now_add=True)

    class Meta: 
        verbose_name_plural = 'Income Sources'

    def __str__(self):
        return self.description

Виды кода

def generate_reports(request):
    searchForm = IncomeSearchForm(request.POST or None)
    searchExpensesForm = ExpensesSearchForm(request.POST or None)
    if request.method == "POST" and searchForm.is_valid() and searchExpensesForm.is_valid():
        listIncome = Income.objects.filter(date__range=[searchForm['start_date'].value(),searchForm['end_date'].value()])
        total_income_passport = listIncome.values('description').order_by('description').annotate(total = Sum('amount')).get('total') or 0
        context = { 'total_income_passport':total_income_passport, }
        return render(request, 'cashier/print_report.html', context)
    else:
        listIncome = Income.objects.all()
    context = { 'listIncome ':listIncome , }
    return render(request, 'cashier/gen_report.html', context)

Обратите внимание, что у меня нет проблем с диапазоном дат, но моя проблема связана с суммой по каждому описанию в модели. Ваш ответ будет очень признателен. спасибо

Вот моя версия, следующая документации:

from django.db.models import Sum

def generate_report(request):
    if request.method == 'POST':
        income_form = IncomeSearchForm(request.POST or None)
        expense_form = ExpensesSearchForm(request.POST or None)

        if income_form.is_valid() and expense_form.is_valid():
            start_date = income_form.cleaned_data['start_date']
            end_date = income_form.cleaned_data['end_date']

            grouped_incomes = Income.objects.filter(date__range=[start_date,end_date]).order_by('description')
            grouped_incomes_with_total = grouped_incomes.values('description').annotate(total = Sum('amount')).order_by()

            context = {'incomes': grouped_incomes_with_total}
            return render(request, 'print_report.html', context)

    else:
        income_form = IncomeSearchForm()
        expense_form = ExpensesSearchForm()

    context={
        'income_form': IncomeSearchForm,
        'expense_form': ExpensesSearchForm,
    }

    return render(request, 'generate_report.html', context)
Вернуться на верх