我有一对多的关系。
class Invoice(models.Model):
stuff
class Item(models.Model):
invoice = models.ForeignKey(Invoice)
qty = models.IntegerField()
unit_price = models.DecimalField(max_digits=4, decimal_places=2)
我想进行查询以选择发票中的所有行以及每张发票的所有项目的价格总和,并通过查询集访问它
e.g。
因此,如果invoice #1
有2 items
,则每个qty=2
和unit_price=3
,invoice #1
都有amount 2x2x3 = $12
更新:
这是我到目前为止所得到的,但它给了我一个追溯
inv_list = \
Invoice.objects.select_related().all()\
.aggregate(sum=sum('item__unit_price')).order_by('-inv_date')
TypeError at /site/invoice/
unsupported operand type(s) for +: 'int' and 'str'
更新
感谢您的输入,我排了一些队列,最后我创建了一个新列unit_amount
,为.save()
方法添加了一个额外的操作prod_qty * unit_price
并将其保存到新栏目。
然后做了这个:
inv_list = Invoice.objects.all()\
.annotate(amount=Sum('item__unit_amount')).order_by('-inv_date')
答案 0 :(得分:2)
如果您执行select_related()
,我认为您应该.aggregate(sum=sum('unit_price'))
,对吧?仍select_related()
似乎还有很多。
同样aggregate
会给你一个字典{sum:value}
,所以排序似乎是个错误?它是为了什么?虽然不确定。 :)
如果这不起作用怎么样尝试这个有点不同?
for invoice in Invoice.objects.all():
tmp = invoice.item_set.aggregate(sum=sum('unit_price'))
# do some stuff with sum
因为我相信你想要每张发票的总和,而不是全球总和。试一试。
//编辑:当然我忘记了数量。在这种情况下,红外代码更好。
答案 1 :(得分:2)
for invoice in Invoice.objects.all():
ammount = 0
for item in invoice.item_set.all():
ammount += item.qty * item.unit_price
print invoice.pk, ammount
答案 2 :(得分:2)
自F()
个词were refactored in Django 1.8以来,这变得简单明了:
from django.db.models import F, Sum
Invoice.objects.annotate(Sum(F('item__unit_price') * F('item__qty')))