Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django中的多级分组和聚合_Python_Django - Fatal编程技术网

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看起来非常脆弱,当你碰到一些远程复杂的东西时,它几乎是无用的。我的回答有助于解决你的聚合问题吗?请投票并选择正确答案。否。这对我不起作用。