【问题标题】:How to calculate sum and also cumulative sum in django orm如何在 django orm 中计算总和以及累积总和
【发布时间】:2020-04-18 15:20:01
【问题描述】:

我有表项目,项目有子项目,子项目有开发人员。另一个表 sprint,工作分布在 sprint 1 2 ..n 等等,每个 sprint 都有不同的开发人员数据。现在我如何使用 Django Orm 计算总和、当前 sprint 值和完成百分比。

项目有子项目外键

 class project(models.Model):
        title = models.CharField(max_length=150)
        project = models.ForeignKey("self", on_delete=models.CASCADE,
                             related_name="subproject", blank=True, null=True)

  Developers table

  class Developers(models.Model):
        quantity = models.FloatField(default=0.0)
        charge_rate = models.FloatField(default=0.0)
        project = models.ForeignKey("Project", on_delete=models.SET_NULL,
                                 related_name="developers",  null=True)

Table Sprint

class Sprint(models.Model):
    sprint_name = models.CharField(max_length=150)
    percentage = models.FloatField(default=0.0)

sprint data

class SprintsData(models.Model):
    sprint = models.ForeignKey(
        "project", on_delete=models.CASCADE, related_name="d",
        blank=True)
    percentage = models.FloatField(default=0.0)

这是样本数据

项目

id name         project
1  development  null

子项目

id   name       project
 1  Homepage     1
 2  header       1
 3  footer       1

开发者

id   name        quantity rate  project (sub project foreign key)
1    developers   5       200    1
2    designer      5       150    2

冲刺

id     name    start_date end_date
1     sprint1    -           -

冲刺数据

id    sprint  project(subproject foreign key)  percentage
 1      1          1                               5
 2      1          2                               80

输出看起来像

sprint    project      sub_project   total_sum             percentage_complete current_sprint_amount
sprint1  development     Homepage   (quantity*charge_rate)         5              (total_sum)5% 
sprint1  development     Header        5*150                       80             (5*150)*80%     

【问题讨论】:

  • 哪个型号的总和?
  • 开发者表格的总和请帮忙。我需要像上面那样显示输出我可以更改表外键吗?
  • 开发者数量之和*charge_rate?
  • 是的,我需要在总和中显示每个冲刺值
  • 您在问题中按“sub_project”分组的表是您想要的吗?

标签: python django django-models django-rest-framework


【解决方案1】:

以下查询将返回所有带有total_sumcurrent_sprint_amount 注释的SprintsData 对象。从这里你应该能够生成你的表

from django.db.models import Sum, F
SprintsData.objects.annotate(
    total_sum=Sum(F('sprint__developers__quantity') * F('sprint__developers__charge_rate'), output_field=models.FloatField())
).annotate(
    current_sprint_amount=F('total_sum') * F('percentage')
)

SprintsData.sprint 实际上是 project 模型的外键,这有点令人困惑

Sprint 模型与任何其他模型都没有关系,所以我不确定您将如何获得 sprint 名称

【讨论】:

  • 非常感谢我会计算累积总和但我得到了答案!
猜你喜欢
  • 2017-09-16
  • 1970-01-01
  • 1970-01-01
  • 2017-10-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多