序幕:
这是SO中经常出现的一个问题:
- Django 模型分组依据
- Django 相当于 count 和 group by
- 如何在 django 中进行 GROUP BY 查询?
- 如何使用 ORM 进行相当于 SQL 计数、分组和连接查询?
我已经在 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
我们可以执行一个GROUP BY ... COUNT
or a GROUP BY ... SUM
Django ORM 上的 SQL 等效查询,使用annotate(), values(), the django.db.models
's Count
and Sum
方法尊重和可选order_by() method:
-
按...计数分组:
from django.db.models import Count
result = Books.objects.values('author')
.order_by('author')
.annotate(count=Count('author'))
现在结果包含一个字典有两把钥匙:author
and count
:
author | count
------------|-------
OneAuthor | 5
OtherAuthor | 2
... | ...
-
按...分组:总和:
from django.db.models import Sum
result = Books.objects.values('author')
.order_by('author')
.annotate(total_price=Sum('price'))
现在结果包含一个字典有两列:author
and total_price
:
author | total_price
------------|-------------
OneAuthor | 100.35
OtherAuthor | 50.00
... | ...
更新 13/04/2021
正如 @dgw 在评论中指出的那样,如果模型使用元选项来对行进行排序(例如ordering), the order_by() clause 是最重要的为了大会的成功!
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)