【问题标题】:Sumproduct using Django's aggregationSumproduct 使用 Django 的聚合
【发布时间】:2011-02-02 06:25:14
【问题描述】:

问题

背景

我正在为一张发票建模,它可以包含多个项目。 Invoice 和 Item 模型之间的多对多关系是通过 InvoiceItem 中间表处理的。

发票的总金额(amount_invoiced)是通过将给定发票上每个项目的 unit_pricequantity 的乘积相加得出的。下面是我目前用来完成此操作的代码,但我想知道是否有更好的方法来使用Django's aggregation capabilities 来处理此问题。

当前代码

class Item(models.Model):
    item_num = models.SlugField(unique=True)
    description = models.CharField(blank=True, max_length=100)


class InvoiceItem(models.Model):
    item = models.ForeignKey(Item)
    invoice = models.ForeignKey('Invoice')
    unit_price = models.DecimalField(max_digits=10, decimal_places=2)
    quantity = models.DecimalField(max_digits=10, decimal_places=4)


class Invoice(models.Model):
    invoice_num = models.SlugField(max_length=25)
    invoice_items = models.ManyToManyField(Item,through='InvoiceItem')

    def _get_amount_invoiced(self):
        invoice_items = self.invoiceitem_set.all()
        amount_invoiced = 0
        for invoice_item in invoice_items:
            amount_invoiced += (invoice_item.unit_price *
                invoice_item.quantity)
        return amount_invoiced

    amount_invoiced = property(_get_amount_invoiced)        

【问题讨论】:

    标签: django django-models aggregate aggregation


    【解决方案1】:

    是的,从 Django 1.1 开始引入聚合函数是可能的。这是您的模型的解决方案:

     def _get_amount_invoiced(self):
         self.invoiceitem_set.extra(select=("item_total": "quantity * unit_price")
                                    ).aggregate(total=Sum("item_total")["total"]
    

    但是,强烈建议将 item_total 存储在数据库中,因为它可能会受到折扣、税收和其他变化的影响,这使得计算它不切实际甚至不可能。

    【讨论】:

    • 我无法复制它,我不断收到“无法将关键字'item_total'解析到字段中。”:(
    猜你喜欢
    • 2014-09-23
    • 2012-01-15
    • 2010-12-20
    • 1970-01-01
    • 1970-01-01
    • 2014-07-15
    • 2019-11-15
    • 1970-01-01
    • 2011-01-20
    相关资源
    最近更新 更多