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