Django - Мне нужно, чтобы после отфильтрованного поиска отображалась общая сумма

У меня есть столбец в таблице, который имеет десятичные значения и связан с этой таблицей фильтром, который ищет по дате и коду сайта. Я хочу, чтобы после выполнения поиска отображалась общая сумма столбца.

У меня есть настройка агрегации на этом столбце, которая работает, но она не динамическая, и когда я выполняю поиск, она просто сохраняет значение общего итога как нефильтрованный результат. Желаемый ответ заключается в том, чтобы итоговое значение изменялось с каждым результатом поиска.

Models.py

class expense(models.Model):
    ExcludeTax = models.DecimalField('Exclude Tax', max_length=20, blank=True, null=True, max_digits=10, decimal_places=2)
    IncludeTax = models.DecimalField('Include Tax', max_length=20, blank=True, null=True, max_digits=10, decimal_places=2)
    user = models.ManyToManyField(dbmobile, blank=True)
    Date = models.DateField(default=now)

Views.py

def expense_table(request):
    item = expense.objects.all().order_by('IncludeTax')
    add = expense.objects.all().aggregate(Sum('IncludeTax'))['IncludeTax__sum']
    search_list = expense.objects.all().order_by('user__Site_Code', 'Date')
    search_filter = expenseFilter(request.GET, queryset=search_list)
    return render(request, 'expense/MExpense.html', {'item': item, 'filter': search_filter, 'add': add})

filters.py

class expenseFilter(django_filters.FilterSet):
    Date = django_filters.DateFromToRangeFilter(widget=RangeWidget(attrs={'type': 'date'}))

    class Meta:
        model = expense
        fields = ['Date', 'user__Site_Code']

html

    <tfoot>
    <tr>
    <td><b>Total</b></td>
    <td><b>{{add}}</b></td>
    </tfoot>

Ваш общий итог рассчитывается по следующей строке:

add = expense.objects.all().aggregate(Sum('IncludeTax'))['IncludeTax__sum']

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

def expense_table(request):
    item = expense.objects.all().order_by('IncludeTax')
    search_list = expense.objects.all().order_by('user__Site_Code', 'Date')
    search_filter = expenseFilter(request.GET, queryset=search_list)
    add = search_filter.qs.aggregate(Sum('IncludeTax'))['IncludeTax__sum']
    return render(request, 'expense/MExpense.html', {'item': item, 'filter': search_filter, 'add': add})
Вернуться на верх