序幕:
这是SO中经常出现的问题:
我已经在SO文档中编写了一个示例,但由于文档将于2017年8月8日关闭,我将遵循this widely upvoted and discussed meta answer的建议并将我的示例转换为自我回答的帖子。
当然,我也很乐意看到任何不同的方法!
题:
假设模型:
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
我们可以在Django ORM上执行GROUP BY ... COUNT
或GROUP BY ... SUM
SQL等效查询,使用annotate()
,values()
,django.db.models
的Count
和Sum
方法,并且可选地使用order_by()
方法:
result = Books.objects.values('author')
.order_by('author')
.annotate(count=Count('author'))
现在结果包含一个包含两个键的字典:author
和count
:
author | count
------------|-------
OneAuthor | 5
OtherAuthor | 2
... | ...
result = Books.objects.values('author')
.order_by('author')
.annotate(total_price=Sum('price'))
现在结果包含一个包含两列的字典:author
和total_price
:
author | total_price
------------|-------------
OneAuthor | 100.35
OtherAuthor | 50.00
... | ...