django子组最大值的总和

时间:2018-07-19 21:47:44

标签: django django-queryset django-orm

我在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

我最终想要的是一种为每个amount获取与最新date相对应的category的总和的方法。为了说明:

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

我试图弄清楚如何通过对该查询集的聚集调用来获取值4051。我已经尝试过我能想到的“值”,“注释”和“汇总”的每种组合,但没有任何方法能获得理想的结果。以下内容为我提供了每个category的最新日期,但是每次我尝试获取相应的amount的总和时,都会在 {{1} },而不仅仅是最大值。

amount

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

任何指导表示赞赏。

1 个答案:

答案 0 :(得分:0)

我认为您需要一些数据结构来实现此目标,如果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)