django - 在 Django 模型的属性中使用聚合

标签 django django-models django-aggregation

架构描述
enter image description here
一个项目可能有多个项目项目,一个项目项目可能有多个购置成本。例如,资本项目 #1 包含两个项目项:

  • 数量。采购生产设备1台
  • 从供应商处购买设备的一项采购成本为 5,000 美元

  • 数量。 1个由工作人员构建的测试夹具
  • 每次购买 12 次 1,000 美元,总采购成本为 12,000 美元。


  • 生产设备可能只有一项与购买相关的成本。但是,测试夹具可能会产生与构建它相关的多种成本。
    欲望
    我希望能够确定每个项目的总购置成本,并且我希望能够确定每个项目的总购置成本。基于上面的例子:
  • 项目 1 的总购置成本 = 5,000 美元
  • 项目 2 总购置成本 = 12,000 美元
  • 资本项目总购置成本 = 17,000 美元

  • 问题
  • total_acquisition_costs使用 Django 的聚合计算或保存为 DecimalFieldProjectProjectItem楷模?
  • 我应该创建一个 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/

    相关文章:

    python - 使用Django向前端传递JSON数据

    Django表单覆盖ForeignKey查询集

    Django 包含零的总和

    django - 从 Django 的 ArrayAgg 中排除空值

    django - 从 Django 获取每日对象计数

    python - 如何在 Django 1.8 中多次保存同一个表单?

    Python 日期时间

    mysql - 如何将数据从数据转储(SqLite3)导入到 django 中?

    python - Django 过滤器模型一对多关系,价格之间的最大差异

    django 将模型实例转换为 dict