【问题标题】:django aggregate sum of subgroup maximumsdjango 子组最大值的总和
【发布时间】:2018-12-28 03:43:07
【问题描述】:

我在 Django 中使用 MySQL 进行了以下简化设置:

class Category(models.Model):
    name = models.CharField(max_length=255)

class MyTable(models.Model):
    category = models.ForeignKey('Category', on_delete=models.CASCADE)
    date = models.DateField()
    amount = models.IntegerField()
    class Meta:
        unique_together = ['category', 'date']

还有一个查询集,包含MyTable 的以下示例数据:

date        category_id amount
2017-12-01  3           2
2018-01-01  1           100
2018-02-01  1           50
2018-03-01  2           2000
2018-04-01  2           4000
2018-05-01  3           2
2018-06-01  3           1

我最终想要的是一种方法来获取与每个category 的最新date 对应的amounts 的总和。举例说明:

  • category_id 1 的最新date 是 2018-02-01,其中amount 是 50;
  • category_id 2 的最新date 是 2018-04-01,其中 amount 是 4000;
  • category_id 3 的最新date 是 2018-06-01,其中amount 是 1;
  • 50 + 4000 + 1 = 4051

我试图弄清楚如何通过对该查询集的聚合调用来获取值 4051。我已经尝试了我能想到的“值”、“注释”和“聚合”的所有组合,但没有得到想要的结果。以下为我提供了每个 category 的最新日期,但每次我尝试获取相应 amounts 的总和时,它都会在 每个 amount 上计算它,而不仅仅是最大值.

MyTable.objects.values('category').annotate(Max('date'))

我正在尝试通过 Django 的 ORM 来实现吗?我发布了另一个关于这个确切示例的 MySQL 语法是什么的问题,但也无法将其应用于 Django 查询集。

任何指导表示赞赏。

【问题讨论】:

    标签: django django-queryset django-orm


    【解决方案1】:

    我认为您需要一些数据结构来实现这一点,如果 Djnago ORM 或 sql 不符合您的要求(无法编写),请查看以下答案

    l=[]
    x=MyTable.objects.values('category').annotate(date=Max('date'))
    for y in x:
        qq= MyTable.objects.get(category_id=y.get(category),date=y.get(date))
        l=l+qq.amount
    total_amount = sum(l)
    print(total_amount)
    

    【讨论】:

    • 虽然出于性能原因我一直希望仅在数据库级别执行此操作,但您的答案似乎是使用 Django 的 ORM 和 MySQL 实现此目的的唯一方法(不更改其任何设置) ,所以我将此标记为已接受的答案。感谢您的帮助!
    猜你喜欢
    • 2018-12-27
    • 1970-01-01
    • 2016-05-27
    • 2014-08-07
    • 2023-04-06
    • 2013-03-05
    • 2020-10-22
    • 1970-01-01
    • 2020-11-11
    相关资源
    最近更新 更多