我有一组导入的银行帐户条目,按日期和每个日期内的序号排序。在
我使用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
转换为一个列表,并保持其他所有内容不变,则可以:
我的queryset
很大,因为它是一个商业银行账户的9年历史,所以复制到list
上似乎效率很低。在
我在StackOverflow
上看到了其他示例,它们似乎暗示我的原始代码应该可以工作,而pdb测试则暗示应该这样做。这是django-tables2
里的东西吗?在
正如我在评论中所说,你所做的对我的案子起作用了。但是,我不建议使用
for
循环来计算查询,因为这会将查询集加载到内存中(它实际上与使用list
具有相同的效果)。相反,我建议在查询中添加一个额外的行,该行将包含正在运行的总和。在为此,您应该使用^{} queryset method 将额外的字段添加到查询集中。要了解如何使用SQL获取运行总数,可以查看以下问题的答案:How to get running sum of a column in sql server
另外,既然您提到您的查询集很大,应该将分页添加到您的表中,并且如果您使用
for-loop
来计算查询集,则分页将使您受益匪浅。如果在实现extra()
方法时遇到问题,请随时再次询问。在更新:回答OP的评论(我不确定表和字段的名称,但我会猜测一下:
一个(复杂的)查询
as running_total
将是extra()
queryset方法将创建的内容:)相关问题 更多 >
编程相关推荐