我正在寻找一种方法来获取一对多关系中相关字段的总和。
目前,如果有这个联系:
class Part(models.Model):
name = models.CharField(_("Name of part"), max_length=255)
# ...
class StorageItem(models.Model):
part = models.ForeignKey(Part)
storage = models.ForeignKey(StoragePlace)
on_stock = models.DecimalField(_("Parts inside storage"),max_digits=10, decimal_places=4,null=True,blank=True)
# ...
class StoragePlace(models.Model):
name = models.CharField(max_length=50)
如您所见,一部分可以位于具有不同on_stock值的不同StoragePlaces中。我现在正在寻找一种方法来查找所有零件,其中StorageItem.on_stock的总和低于最小值。
对于单个部分我计算每英尺的数量'
sum_amount = 0
for si in self.storageitem_set.all():
if si.on_stock is not None:
sum_amount = sum_amount + si.on_stock
这样做时会变得安静,因为它可能会形成1000个零件和一堆StorgeItems。
我尝试过像
这样的事情Part.objects.annotate(total_amount=Sum('storageitem__on_stock'))
但失败了,因为它似乎只适用于不同的方向。实际上它只返回Part。它回来了:
>>> tmp = Part.objects.annotate(total_amount=Sum('storageitem__on_stock'))
>>> print tmp
[<Part: Testteil 1>]
>>> print tmp.total_amount
Traceback (most recent call last):
File "<console>", line 1, in <module>
AttributeError: 'QuerySet' object has no attribute 'total_amount'
其中&#34; Testteil&#34;是测试部分的名称。
所以我的问题是:Django的做法是什么?