Поле добавлено в наборы запросов django, не работающие в django-tables2
У меня есть набор импортированных записей банковского счета, которые упорядочены по дате и порядковому номеру в каждой дате.
Я использую django-tables2 для отображения данных, к которым я добавляю столбец промежуточной суммы, который я вычисляю перед рендерингом представления.
Для этого я пытаюсь добавить поле к набору запросов с помощью следующего кода:
import django_tables2 as tables
from django_tables2 import RequestConfig
from .models import Bank, BankImportFile, ImportFileEntry
... other imports
class BankListingTable(tables.Table):
memo = tables.Column(verbose_name = 'Description')
total = tables.Column(verbose_name = 'Running Total')
class Meta:
model = ImportFileEntry
attrs = {'class': 'paleblue'}
def bank_listing(request, bankname):
bank = get_object_or_404(Bank, pk=bankname)
qs = ImportFileEntry.objects.filter(account=Bank(bank)).order_by('date', 'seq')
total = 0
for row in qs:
total += row.amount
row.total = total
table = BankListingTable(qs)
RequestConfig(request).configure(table)
return render(request, 'banking/bank_transactions.html', {'table': table, 'bank': bank})
Если я перейду этот код в pdb
Я могу изучить оба row.total
а также qs[<row number>].total
и они, кажется, имеют правильные данные.
Все же в отрисованной таблице все, что я получаю в итоговом столбце, это --
Если я конвертирую queryset
в список и оставить все остальное без изменений, это работает:
def bank_listing(request, bankname):
bank = get_object_or_404(Bank, pk=bankname)
qs = ImportFileEntry.objects.filter(account=Bank(bank)).order_by('date', 'seq')
qs = list(qs) # ADDED THIS LINE AND IT WORKS
total = 0
for row in qs:
total += row.amount
row.total = total
table = BankListingTable(qs)
RequestConfig(request).configure(table)
return render(request, 'banking/bank_transactions.html', {'table': table, 'bank': bank})
мой queryset
большой, так как это 9-летняя история коммерческого банковского счета, поэтому копирование его на list
,
Я видел другие примеры на Stackru
похоже, мой исходный код должен работать, а тестирование pdb - должно. Это что-то в django-tables2
?
1 ответ
Как я сказал в своем комментарии, то, что вы сделали, работает в моем случае. Однако я бы не рекомендовал оценивать запрос с помощью for
цикл, так как это загрузит ваш набор запросов в память (это на самом деле имеет тот же эффект, что и использование list
). Вместо этого я бы порекомендовал добавить в ваш запрос дополнительную строку, которая будет содержать текущую сумму.
Для этого вы должны использовать extra
Метод набора запросов, чтобы добавить дополнительное поле в ваш набор запросов. Чтобы узнать, как получить промежуточную сумму с помощью SQL, вы можете проверить ответ на этот вопрос: Как получить промежуточную сумму столбца на сервере SQL
Кроме того, поскольку вы упоминаете, что ваш набор запросов большой, вы должны добавить нумерацию страниц в свою таблицу - и вы не выиграете от нумерации страниц, если оцените свой набор запросов с помощью for-loop
, Не стесняйтесь спрашивать снова, если у вас есть проблемы с реализацией extra()
метод.
Обновление: чтобы ответить на комментарий ОП (я не уверен насчет имен ваших таблиц и полей, но я сделаю предположение:
SELECT amount, (
select sum(amount) FROM ImportFileEntry ife1 where ife1.date < ife.date
) + (
select sum(amount) FROM ImportFileEntry ife2 where ife2.date = ife.date and ife2.seq < ife.seq
) as running_total FROM ImportFileEntry ife order by ife.date, ife.seq
Один (сложный) запрос - as running_total
будет то, что extra()
метод queryset создаст:)