【问题标题】:Using an aggregate in a Django model's property在 Django 模型的属性中使用聚合
【发布时间】:2011-12-11 06:06:52
【问题描述】:

架构描述

一个项目可能有多个项目项,一个项目项可能有多个购置成本。例如,资本项目 #1 包含两个项目项:

  1. 数量。购买1台生产设备
    • 从供应商处购买设备的一次购置成本为 5,000 美元
  2. 数量。 1个由工作人员搭建的测试夹具
    • 购买 12 次,每次 1000 美元,总购置成本为 12000 美元。

生产设备可能只有一项与购买相关的成本。但是,测试夹具可能需要与构建它相关的多种成本。

愿望

我希望能够确定每个项目的总购置成本,并且我希望能够确定每个项目的总购置成本。根据上面的例子:

  • 项目 1 总购置成本 = 5,000 美元
  • 第 2 项总购置成本 = 12,000 美元
  • 资本项目总购置成本 = 17,000 美元

问题

  1. 应该使用 Django 的聚合计算 total_acquisition_costs 还是在 ProjectProjectItem 模型上保存为 DecimalField

  2. 我应该为ProjectItemProject 模型创建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

【问题讨论】:

  • 你是用什么生成类图的?
  • @Tom:我在 OS X 上使用 OmngiGraffle Professional 并使用从 Graffletopia.com 下载的 Django 绘图模板创建绘图。

标签: django django-models django-aggregation


【解决方案1】:

我喜欢您使用 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"]

【讨论】:

    猜你喜欢
    • 2011-09-02
    • 2021-09-03
    • 1970-01-01
    • 1970-01-01
    • 2014-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多