Django:检索相关对象数量的总和并将其用作过滤器

时间:2014-12-01 17:28:56

标签: python django filter

我正在寻找一种方法来获取一对多关系中相关字段的总和。

目前,如果有这个联系:

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的做法是什么?

0 个答案:

没有答案