项目可能有多个项目项目,项目项目可能有多个购置成本。例如,资本项目#1包含两个项目项目:
生产设备可能只有一个与购买相关的成本。但是,测试夹具可能会产生与构建它相关的多个成本。
我希望能够确定每个项目的总购置成本,并且我希望能够确定每个项目的总购置成本。基于上面的例子:
total_acquisition_costs
是应该使用Django的聚合计算还是DecimalField
和Project
模型上保存为ProjectItem
?我应该为total_acquisition_costs
和ProjectItem
模型创建Project
属性吗?创造财产我的直觉是肯定的。
我的直觉是使用聚合来计算值,以避免数据库非规范化。具体来说,我倾向于使用Django的聚合Sum
函数来创建total_acquisition_costs
属性。但是,我并不知道如何将聚合作为属性放在模型上,以便它只返回一个值而不是一个字典。
注意:我当前的代码不使用Django的聚合功能,但它可以正常工作。
class ProjectItem(models.Model):
project = models.ForeignKey(CapExProject)
name = models.CharField(max_length=128)
@property
def total_acquisition_costs(self):
acquisition_costs = self.acquisitioncost_set.only(
'amount')
total_acquisition_costs = 0
for acquisition_cost in acquisition_costs:
total_acquisition_costs += acquisition_cost.amount
return total_acquisition_costs
答案 0 :(得分:13)
我喜欢你使用Sum的想法,但是把它变成了属性。这样的事情应该有效:
class Project(models.Model):
@property
def total_acquisition_costs(self):
return AcquisitionCost.objects.filter(item__project=self).aggregate(total=Sum("amount"))["total"]
class ProjectItem(models.Model):
@property
def total_acquisition_costs(self):
return self.acquisitioncost_set.aggregate(total=Sum("amount"))["total"]