首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在Django模型的属性中使用聚合

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

Stack Overflow用户
提问于 2011-10-19 19:53:20
回答 1查看 4.9K关注 0票数 12

模式描述

一个项目可以有多个项目项目,一个项目项目可以有多个采购成本。例如,基本建设项目1包含两个项目:

  1. Qty.从supplier

采购设备的采购费用为5,000美元

  1. Qty.一个由工作人员
    • 建造的测试夹具,每件购买1,000美元,用于购买的总成本

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

欲望

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

  • 项目1采购费用总额=5,000美元
  • 项目2采购费用总额=

项目总采购费用=17,000

问题

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

  1. 应该为ProjectItemProject模型创建一个total_acquisition_costs属性吗?我的直觉是肯定要创造一项财产。

我的直觉是使用聚合来计算值,以避免数据库非正规化。具体来说,我倾向于使用Django的聚合Sum函数来创建一个total_acquisition_costs属性。但是,我并不是在探索如何将聚合作为属性放在模型上,以便它只返回一个值而不是一个字典。

当前代码

注释:当前的代码不使用Django的聚合功能,但它可以工作。

代码语言:javascript
运行
复制
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
EN

回答 1

Stack Overflow用户

发布于 2011-10-19 20:09:26

我喜欢你的想法,使用和,但使它成为一个财产。像这样的事情应该有效:

代码语言:javascript
运行
复制
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"]
票数 14
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7827295

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档