Python Django中的多级分组和聚合
我有一个这样的模型:Python Django中的多级分组和聚合,python,django,Python,Django,我有一个这样的模型: class Price(models.Model): book = models.ForeignKey(Book) date = models.Dateield(auto_now_add=True) publisher = models.ForeignKey(Publisher) price = models.PositiveSmallIntegerField() 对于多个栏目没有唯一的限制,对于同一出版商,每本书一天可以有多个价格 我想对
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实现这一点。有什么帮助吗?Django中的聚合api在这里有详细的文档记录: 在您的示例中,发布者聚合的示例如下
query_set = Price.objects.extra(select={'count': 'count(1)'},
order_by=['-count']).values('count', 'publisher')
query_set.query.group_by = ['publisher']
对于多层次。我相信您可以继续调用query\u set对象上的aggregate()和group\u by函数。您还可以将SQL查询用作视图,并围绕该视图创建Django模型
详细说明可在此处找到:请小心使用
QuerySet.query.group\u by
。它的使用是没有文档记录的,从我所读到的,结果是相当复杂的,有时对某些人很有效,有时对其他人很有用。当前Django认可的GROUP_BY方法是values(…).annotate(…)
方法。(提供了链接Matt上的讨论)。这并不理想,但它可以可靠地工作。我同意这是Django很久以前就应该处理的事情,但是现在,我不确定推荐黑客是否一定是正确的方法。嗨,Matt,我在想这个问题上有点困难。我写了:Price.objects.filter(Price\u isnull=False)。extra(select={'date':'date(date)})。value('id','book\u id','publisher\u id','date','Price')
。因为我在SQLite上,所以需要将这些时间戳转换为有效日期。当我想通过添加一个.aggregate(Avg('price'))来聚合它时,
我得到了一个空的dict。我很不明白为什么会发生这种情况。你的价格值是非空的吗?它们是数字吗?另一种方法是跨过Django模型,在SQLlite数据库上编写SQL。(group by语法在这里正常工作)表中没有任何非数值,我只是检查了一下。但它是一个可为空的字段,这就是为什么筛选子句是空的。我正试图使用Django ORM来实现这一点,但看起来我必须使用原始SQL。整个ORM看起来非常脆弱,当你碰到一些远程复杂的东西时,它几乎是无用的。我的回答有助于解决你的聚合问题吗?请投票并选择正确答案。否。这对我不起作用。