Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 添加到django查询集的字段在django-tables2中不起作用_Python_Django_Django Queryset_Django Tables2 - Fatal编程技术网

Python 添加到django查询集的字段在django-tables2中不起作用

Python 添加到django查询集的字段在django-tables2中不起作用,python,django,django-queryset,django-tables2,Python,Django,Django Queryset,Django Tables2,我有一组导入的银行帐户条目,它们在每个日期内按日期和序号排序 我使用django-tables2来显示数据,向其中添加了一个在呈现视图之前计算的运行总计列 为此,我尝试使用以下代码向查询集中添加一个字段: import django_tables2 as tables from django_tables2 import RequestConfig from .models import Bank, BankImportFile, ImportFileEntry ... other import

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

我使用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[].total,它们似乎有正确的数据

然而,在呈现的表中,我在total列中得到的是-

如果我将查询集转换为列表,其他内容保持不变,则它会工作:

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}) 
我的查询集很大,因为它有9年的商业银行账户历史,所以将其复制到列表中似乎效率很低


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

正如我在评论中所说的,您所做的在我的案例中起作用。但是,我不建议使用for循环来评估查询,因为这将把queryset加载到内存中,它实际上与使用list的效果相同。相反,我建议在查询中添加一个额外的行,该行将包含运行总和

要做到这一点,您应该使用向queryset添加额外字段。要了解如何使用SQL获取运行总数,您可以查看此问题的答案:

此外,由于您提到您的查询集很大,您应该将分页添加到表中——如果您使用for循环评估您的查询集,您将不会受益于分页。如果您在实现额外方法时遇到问题,请随时再次询问

更新:为了回答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将是额外的queryset方法将创建的内容:

Hello!我试着做你做的事,没有转换成列表,效果很好。可能你遗漏了什么…我在这里的示例中看不到解决方案。它似乎得到了一个查询中每个记录的运行总数,我需要运行一个子查询来计算n个记录的n个查询。此外,我的截止日期也很重要,因为我的排序顺序是date-then-seq。我正在使用pgSQL。感谢您的回复和您能提供的任何进一步建议,这将是n行的n个查询,实际上这将是一个复杂的查询。但是,如果按照我的建议使用分页,即使数据库中有数百万行,页面也会有25行。另一方面,如果您使用for循环或列表来计算queryset,那么您需要将所有内容都存储在内存中。您能给我一个提示或一个链接,以一个复杂查询的形式添加字段running_total=日期<此记录日期+日期=此记录日期和seq的所有记录的金额之和吗