Django中的多级分组和聚合

时间:2012-02-23 12:23:38

标签: python django

我的模型看起来像这样:

class Price(models.Model):
    book = models.ForeignKey(Book)
    date = models.Dateield(auto_now_add=True)
    publisher = models.ForeignKey(Publisher)
    price = models.PositiveSmallIntegerField()

多个列没有唯一约束,每本图书可以为同一个发布商提供一天的多个价格。

我想将所有价格分组,但首先我要将特定发布商的特定日期的所有价格(平均值)分组。这将有效地返回日期,出版商和图书的唯一记录。

然后我想将特定日期的特定图书的所有价格(总和)分组。

这是我要写的SQL:

SELECT book_id
     , DATE(date) as date
     , SUM(price) AS price
  FROM
     ( SELECT book_id
            , DATE(date) as date
            , AVG(price) AS price
            , publisher_id
         FROM literature_prices
        GROUP
           BY date
            , book_id
            , publisher_id
     )
 GROUP
    BY book_id
     , date 

这在SQL中很容易,但我不确定如何使用Djano ORM做同样的事情。有什么帮助吗?

2 个答案:

答案 0 :(得分:0)

Django中的聚合api在这里有详细记载:

https://docs.djangoproject.com/en/dev/topics/db/aggregation/

在您的示例中按发布商汇总的示例是。

 query_set = Price.objects.extra(select={'count': 'count(1)'}, 
                           order_by=['-count']).values('count', 'publisher')

 query_set.query.group_by = ['publisher']

对于多层次。我相信你可以继续在query_set对象上调用aggregate()和group_by函数。

答案 1 :(得分:0)

您还可以将SQL查询用作视图,并围绕该视图创建Django模型。

详细说明可在此处找到:http://anthony-tresontani.github.com/Django/2012/09/12/wka-django-orm-limitations/