架构描述
一个项目可能有多个项目项,一个项目项可能有多个购置成本。例如,资本项目 #1 包含两个项目项:
- 数量。购买1台生产设备
- 从供应商处购买设备的一项购置成本为 5,000 美元
- 数量。1个由工作人员搭建的测试夹具
- 12 次 1,000 美元的采购,总采购成本为 12,000 美元。
生产设备可能只有一项与购买相关的成本。然而,测试夹具可能有与构建它相关的多种成本。
欲望
我希望能够确定每个项目的总购置成本,并且我希望能够确定每个项目的总购置成本。基于上面的例子:
- 项目 1 总购置成本 = 5,000 美元
- 项目 2 总购置成本 = 12,000 美元
- 资本项目总购置成本 = 17,000 美元
问题
应该
total_acquisition_costs
使用 Django 的聚合来计算还是保存为DecimalField
andProject
模型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