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