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

#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>
 

Комментарии:

1. Можете ли вы добавить другие части html-шаблона? Части, в которых вы получили доступ к filter .

Ответ №1:

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

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

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

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