我正在为发票建模,其中可以包含多个项目。 Invoice和Item模型之间的多对多关系通过InvoiceItem中间表处理。
发票总额 - amount_invoiced
- 是通过将给定发票上每件商品的unit_price
和quantity
的乘积相加来计算的。下面是我目前用来完成此任务的代码,但我想知道是否有更好的方法可以使用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)
答案 0 :(得分:2)
是的,自从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存储在数据库中,因为它可能会受到折扣,税收和其他变化的影响,这使得计算它的时间变得不切实际甚至是不可能的。