我在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
我知道这是一个很好的开始"这样做的方式,我猜它包括数据库上的许多命中。那么有更好的方法吗?
答案 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'))