Поле добавлено в наборы запросов 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 создаст:)

Другие вопросы по тегам