一个查询的Django和

2024-04-25 02:31:54 发布

您现在位置:Python中文网/ 问答频道 /正文

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

我有一个这样的模型:

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=...)

它们工作得很好,以防我在演示代码中漏掉了一个输入错误。我现在要显示model1,并按类别分组它们的相关model2。我使用regroup template标记(注意,我有一个名为model2s的类方法,它返回与model2 set.filter(active=True)相同的结果):

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

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

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

我看过文档,看到了聚合和注释,但似乎都不允许我根据类别进行求和。我不想对每个类别都这样做:

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

有没有一个更干净的方法来做到这一点,希望其中一个工作与重组很好?


Tags: 方法numbermodelmodelsfilter类别classactive
1条回答
网友
1楼 · 发布于 2024-04-25 02:31:54

我非常确定您可以使用annotate QuerySet方法来完成这项工作。如果我能找到一个好的例子,我会发布一个更新。

更新:我想是这样的。。。。如果我正确理解你的问题。但你会用Count而不是Avg

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

相关问题 更多 >