使用数据库列进行计算

时间:2015-02-15 09:52:20

标签: python django aggregate-functions

我在django中有以下模型

class Job(models.Model):
    cost = models.FloatField()

class Account(models.Model):
    job = models.ManyToManyField(Job, through='HasJob')

class HasJob(models.Model):
    account = models.ForeignKey(Account, related_name='hasjobs')
    job = models.ForeignKey(Job, related_name='hasjobs')
    quantity = models.IntegerField()

因此,账户可以有不同数量的许多工作。我希望能够总结一个帐户的总成本。这可能在数据库级别或我应该为它做python吗?像

account = Account.objects.get(pk=1)
sum = 0
for hasjob in account.hasjobs.all():
    sum += hasjob.quantity*hasjob.job.cost

我知道这是一个很好的开始"这样做的方式,我猜它包括数据库上的许多命中。那么有更好的方法吗?

1 个答案:

答案 0 :(得分:1)

IFAIK聚合无法通过F()表达式求和,因此您必须在python代码中计算总和。

但是你可以将db命中数减少到一个 - 只需将select_related()调用添加到查询集:

total_sum = sum(hasjob.quantity * hasjob.job.cost
                 for hasjob in account.hasjobs.all().select_related('job'))