Joh*_*fis 6 python django group-by django-orm
序幕:
这是SO中经常出现的问题:
我已经在SO文档中编写了一个示例,但由于文档将于2017年8月8日关闭,我将遵循这个广泛上升和讨论的元答案的建议,并将我的示例转换为自我回答的帖子.
当然,我也很乐意看到任何不同的方法!
题:
假设模型:
class Books(models.Model):
title = models.CharField()
author = models.CharField()
price = models.FloatField()
Run Code Online (Sandbox Code Playgroud)
如何使用Django ORM在该模型上执行以下查询:
GROUP BY ... COUNT
:
SELECT author, COUNT(author) AS count
FROM myapp_books GROUP BY author
Run Code Online (Sandbox Code Playgroud)GROUP BY ... SUM
:
SELECT author, SUM (price) AS total_price
FROM myapp_books GROUP BY author
Run Code Online (Sandbox Code Playgroud)Joh*_*fis 17
我们可以进行一个GROUP BY ... COUNT
或者一个GROUP BY ... SUM
在Django的ORM SQL的等效查询,使用的annotate()
,values()
的django.db.models
的Count
和Sum
恭敬的方法和可选的order_by()
方法:
GROUP BY ... COUNT:
from django.db.models import Count
result = Books.objects.values('author')
.order_by('author')
.annotate(count=Count('author'))
Run Code Online (Sandbox Code Playgroud)
现在结果包含一个带有两个键的字典:author
和count
:
author | count
------------|-------
OneAuthor | 5
OtherAuthor | 2
... | ...
Run Code Online (Sandbox Code Playgroud)GROUP BY ... SUM:
from django.db.models import Sum
result = Books.objects.values('author')
.order_by('author')
.annotate(total_price=Sum('price'))
Run Code Online (Sandbox Code Playgroud)
现在结果包含一个包含两列的字典:author
和total_price
:
author | total_price
------------|-------------
OneAuthor | 100.35
OtherAuthor | 50.00
... | ...
Run Code Online (Sandbox Code Playgroud) 归档时间: |
|
查看次数: |
6705 次 |
最近记录: |