django模型来自外键关系的和场

bas*_*sh- 5 django django-models

我有一对多的关系.

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)
Run Code Online (Sandbox Code Playgroud)

我想进行查询以选择Invoice中的所有行以及每张发票的所有项目的价格总和,并通过查询集访问它

例如,因此,如果invoice #12 items,每个qty=2unit_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'
Run Code Online (Sandbox Code Playgroud)

UPDATE

感谢您的输入,我采取了一些队列,最后我创建了一个新列unit_amount,为该.save()方法添加了一个额外的操作prod_qty * unit_price并将其保存到新列.

然后做了这个:

inv_list = Invoice.objects.all()\
.annotate(amount=Sum('item__unit_amount')).order_by('-inv_date')
Run Code Online (Sandbox Code Playgroud)

fre*_*ish 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
Run Code Online (Sandbox Code Playgroud)

因为我相信您想要的是每张发票的总和,而不是全局总和。试一试。

// 编辑:当然我忘记了数量。在这种情况下,红外代码更好。