架构描述
一个项目可能有多个项目项目,一个项目项目可能有多个购置成本。例如,资本项目 #1 包含两个项目项:
生产设备可能只有一项与购买相关的成本。但是,测试夹具可能会产生与构建它相关的多种成本。
欲望
我希望能够确定每个项目的总购置成本,并且我希望能够确定每个项目的总购置成本。基于上面的例子:
问题
total_acquisition_costs
使用 Django 的聚合计算或保存为 DecimalField
在 Project
和 ProjectItem
楷模?total_acquisition_costs
ProjectItem
的属性(property)和 Project
楷模?我的直觉是可以创建一个属性。我的直觉是使用聚合计算值,以避免数据库非规范化。具体来说,我倾向于使用 Django 的聚合
Sum
创建 total_acquisition_costs
的函数属性(property)。但是,我并不是在探索如何将聚合作为属性放在模型上,以便它只返回一个值而不是字典。当前代码
注:我当前的代码没有使用 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
最佳答案
我喜欢您使用 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"]
关于django - 在 Django 模型的属性中使用聚合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7827295/