【问题标题】:django sum for a queryset查询集的 django sum
【发布时间】:2011-08-12 11:27:36
【问题描述】:

我需要在 django 查询集上对数据集进行聚合。

我有一个看起来像这样的模型:

class Model1(models.Model):
    ... some fields here ...

class Model2(models.Model):
    model1 = models.ForeignKey(Model1)
    number = models.IntegerField()
    active = models.BooleanField()
    category = models.CharField(choices=...)

它们工作正常,以防我在该演示代码中遗漏了一个错字。我现在想显示模型 1 以及按类别分组的相关模型 2。我正在使用重组模板标记来执行此操作(请注意,我有一个名为 model2s 的类方法,它返回的结果与 model2_set.filter(active=True) 相同):

{% regroup m1.model2s by category as m2_list %}

然后我将它们正常显示并重新组合。这东西也很好用。现在我需要在每个类别组的顶部添加一个总摘要,其中包含该组的数字总和。因此,如果我有 2 个相同类别的模型 2 引用 1 个模型 1,其中一个的编号 = 1,另一个的编号 = 2,那么我需要显示 3。

实际上会有很多 Model2,所以这可能是一个昂贵的查询。

我查看了文档并查看了汇总和注释,但似乎都不允许我根据类别进行总和。我不想为每个类别都这样做:

m2sum = m1.model2s.filter(category='something').aggregate(Sum('number'))['number__sum']

有没有更简洁的方法来做到这一点,希望其中一种可以很好地重新组合?

【问题讨论】:

    标签: python django django-queryset


    【解决方案1】:

    我很确定您可以使用 annotate QuerySet 方法来做到这一点。如果我能找到一个很好的例子,我会发布更新。

    更新:我认为是这样的......如果我正确理解你的问题。除非您使用 Count 而不是 Avg。

    Author.objects.values('name').annotate(average_rating=Avg('book__rating')) http://docs.djangoproject.com/en/dev/topics/db/aggregation/#values

    【讨论】:

    • 谢谢。这可以正确计算(我需要 Sum,因为我在求和)。这将返回一个字典列表,例如 {'category':'category1', 'number_sum':3}。你知道是否有办法获得附加到每个单独项目的总和?所以我收到的每个 model2 项目都有相应的类别总和?如果没有,我总是可以查看执行此操作返回的列表,但如果是这样,那将是优雅的。
    猜你喜欢
    • 2015-01-02
    • 1970-01-01
    • 2013-06-22
    • 2020-01-18
    • 1970-01-01
    • 2021-09-17
    • 2020-10-26
    • 2017-01-12
    • 2012-04-26
    相关资源
    最近更新 更多