模式描述
一个项目可以有多个项目项目,一个项目项目可以有多个采购成本。例如,基本建设项目1包含两个项目:
采购设备的采购费用为5,000美元
生产设备可能只有一种与购买相关的成本。然而,测试夹具可能需要与构建它相关联的多个成本。
欲望
我希望能够确定每个项目的总采购成本,我希望能够确定每个项目的总采购成本。根据上述例子:
项目总采购费用=17,000
问题
total_acquisition_costs
还是在Project
和ProjectItem
模型上保存为DecimalField
?ProjectItem
和Project
模型创建一个total_acquisition_costs
属性吗?我的直觉是肯定要创造一项财产。我的直觉是使用聚合来计算值,以避免数据库非正规化。具体来说,我倾向于使用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
发布于 2011-10-19 20:09:26
我喜欢你的想法,使用和,但使它成为一个财产。像这样的事情应该有效:
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"]
https://stackoverflow.com/questions/7827295
复制相似问题