如何在Django ORM中执行GROUP BY ... COUNT或SUM?

约翰·穆塔菲斯(John Moutafis):

序幕:

这是在SO中经常出现的一个问题:

我已经编写了一个关于SO文档的示例,但是由于该文档将于2017年8月8日关闭,因此,我将遵循这一广受好评和讨论的元答案的建议,并将我的示例转换为自答复的帖子。

当然,我也很高兴看到任何其他方法!!


题:

假设模型:

class Books(models.Model):
    title  = models.CharField()
    author = models.CharField()
    price = models.FloatField()

如何使用Django ORM在该模型上执行以下查询:

  • GROUP BY ... COUNT

    SELECT author, COUNT(author) AS count
    FROM myapp_books GROUP BY author
    
  • GROUP BY ... SUM

    SELECT author,  SUM (price) AS total_price
    FROM myapp_books GROUP BY author
    
约翰·穆塔菲斯(John Moutafis):

我们可以进行一个GROUP BY ... COUNT或者一个GROUP BY ... SUM在Django的ORM SQL的等效查询,使用的annotate()values()django.db.modelsCountSum尊敬和可选的方法order_by()方法:

  • GROUP BY ... COUNT:

    from django.db.models import Count
    
    result = Books.objects.values('author')
                          .order_by('author')
                          .annotate(count=Count('author'))
    

    现在结果包含一个包含两个键字典authorcount

      author    | count
    ------------|-------
     OneAuthor  |   5
    OtherAuthor |   2
       ...      |  ...
    
  • GROUP BY ... SUM:

    from django.db.models import Sum
    
     result = Books.objects.values('author')
                           .order_by('author')
                           .annotate(total_price=Sum('price'))
    

    现在结果包含一个包含两列字典authortotal_price

      author    | total_price
    ------------|-------------
     OneAuthor  |    100.35
    OtherAuthor |     50.00
        ...     |      ...
    

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

TOP 榜单

热门标签

归档