添加到Django querysets的字段在Djangotables2中不工作

2024-05-18 18:57:33 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一组导入的银行帐户条目,按日期和每个日期内的序号排序。在

我使用django-tables2来显示数据,在呈现视图之前,我向其中添加了一个正在运行的total列。在

为此,我尝试使用以下代码向查询集添加一个字段:

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和{},它们似乎有正确的数据。在

但是在呈现的表中,total列中得到的是--

如果我将我的queryset转换为一个列表,并保持其他所有内容不变,则可以:

^{pr2}$

我的queryset很大,因为它是一个商业银行账户的9年历史,所以复制到list上似乎效率很低。在

我在StackOverflow上看到了其他示例,它们似乎暗示我的原始代码应该可以工作,而pdb测试则暗示应该这样做。这是django-tables2里的东西吗?在


Tags: 数据django代码importtablesrequesttableclass
1条回答
网友
1楼 · 发布于 2024-05-18 18:57:33

正如我在评论中所说,你所做的对我的案子起作用了。但是,我不建议使用for循环来计算查询,因为这会将查询集加载到内存中(它实际上与使用list具有相同的效果)。相反,我建议在查询中添加一个额外的行,该行将包含正在运行的总和。在

为此,您应该使用^{} queryset method将额外的字段添加到查询集中。要了解如何使用SQL获取运行总数,可以查看以下问题的答案:How to get running sum of a column in sql server

另外,既然您提到您的查询集很大,应该将分页添加到您的表中,并且如果您使用for-loop来计算查询集,则分页将使您受益匪浅。如果在实现extra()方法时遇到问题,请随时再次询问。在

更新:回答OP的评论(我不确定表和字段的名称,但我会猜测一下:

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

相关问题 更多 >

    热门问题