添加到django QuerySet的字段不起作用,在Django-tables中不起作用



我有一组导入的银行帐户条目,这些条目在每个日期内按日期和序列编号进行编辑。

我正在使用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.totalqs[<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似乎很低。

我已经在StackOverflow上看到了其他示例,这些示例似乎暗示我的原始代码应该起作用,并且PDB测试意味着应该这样做。这是django-tables2中的东西吗?

正如我在评论中所说的那样,您所做的就是在我的情况下工作。但是,我不建议使用for循环评估查询,因为这会将您的QuerySet加载到内存(实际上它与使用list的效果相同)。相反,我建议在您的查询中添加一个额外的行,其中包含运行和。

要执行此操作,您应该使用extra QuerySet方法将额外的字段添加到您的QuerySet中。要了解如何使用SQL获得运行总计,您可以检查此问题的答案:如何获得SQL Server中的列运行总和

另外,由于您提到您的QuerySet很大,因此应该在桌子上添加分页 - 如果您用The评估QuerySet,您将不会从分页上受益。for-loop。随时询问您是否在实施extra()方法时遇到困难。

update :要回答OP的评论(我不确定您的表格名称&amp;字段,但我会猜测:

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方法创建的内容:)