【问题标题】:Django - show sums of a table of recordsDjango - 显示记录表的总和
【发布时间】:2011-09-18 17:32:57
【问题描述】:

我有一张包含发票清单及其详细信息的表格:

class Invoice(models.Model):
    invoiceNum = models.CharField(etc...)
    invoiceDate = models.DateField(etc...)
    customerID = models.ForeignKey(etc...)
    isPaid = models.CharField(etc...)

Invoice 记录不包含实际发票总额。相反,一张发票的总额由多个 Invoice_Line_Item 记录组成,保存在另一个表中:

class Invoice_Line_Item(models.Model):
    invNum = models.ForeignKey(Invoice)
    itemName = models.CharField(etc...)
    itemPrice = models.DecimalField(etc...)

我有一个 web 应用程序,它在一个大的 HTML 表格中显示所有发票,以及该表格的 tr 行中该发票的所有详细信息。发票日期、发票编号、客户 ID 等详细信息都来自 Invoice 表。这个HTMLtable有数百张发票要显示。

我还想做的是显示每张发票的总价值 - 这是所有行项目的总和。但是,我想不出一种简单的方法来完成此操作,因为发票详细信息和构成发票总额的行项目位于两个不同的表格中。

我认为的一种方法是将整个 Invoice_Line_Item 查询集传递到 HTML 模板中,然后对于表中显示的每张发票 tr,我可以遍历整个 Invoice_Line_Item 查询集,将所有行项目加起来与当前发票相匹配。然而,这似乎非常低效。

关于如何做到这一点的任何更好的想法?

谢谢!

【问题讨论】:

    标签: django django-templates


    【解决方案1】:

    一个词:聚合

    Invoice_Line_Item.objects.filter(invNum=invoice).aggregate(Sum('itemPrice'))
    

    https://docs.djangoproject.com/en/dev/topics/db/aggregation/

    另一种方法是将总数存储在发票中,并在您更改相关Invoice_Line_Item时更新它

    【讨论】:

    • 有趣。所以我会创建一个聚合查询集,并将 that 传递给模板。这样我只会迭代一个比整个Invoice_Line_Item 查询集小得多的聚合查询集。我有这个权利吗?
    • 不,聚合返回像 {'itemPrice__Sum': 100} 这样的字典。我认为。你可以让它成为 Invoice 的一个函数,这样会更漂亮。阅读文档以进行说明。
    • 感谢您的提示。我现在正在阅读文档。我认为这是一个很好的解决方案。
    【解决方案2】:

    还有一个词:annotate。

    from django.models import Sum
    
    Invoice.objects.filter( .. ).annotate( InvTotal=Sum( 'invoice_line_number__itemPrice' ) ) 
    

    InvTolal 成为 Invoice 对象的一个​​新属性,您可以像 invoiceNum 或 invoiceDate 一样在模板中使用它。

    使用这种方法,您不必将任何其他数据结构传递给您的模板,只需一个 QuerySet 发票。

    请注意: Sum的参数是一个字符串,它是由相关模型的名称转换为小写,而不是双'_'和相关模型中的字段名称的连接。

    【讨论】:

      猜你喜欢
      • 2018-11-02
      • 2011-05-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-09
      • 2018-08-26
      • 2012-05-24
      • 2020-03-02
      相关资源
      最近更新 更多