当前位置:首页>行业
Django笔记十七之group by 分组用法总结
2023-04-08 06:41:33
来源:博客园

本文首发于微信公众号:Hunter后端原文链接:Django笔记十七之group by 分组用法总结

这篇笔记介绍 Django 里面 model 的 group by 对应的一些操作。


(相关资料图)

用到的 Model 如下:

class TestModel(models.Model):    num = models.IntegerField()    user_id = models.IntegerField()    create_date = models.DateField()

我们写入几条数据:

TestModel.objects.create(num=78, user_id=1, create_date="2022-01-01")TestModel.objects.create(num=99, user_id=1, create_date="2022-01-01")TestModel.objects.create(num=87, user_id=1, create_date="2022-01-08")TestModel.objects.create(num=66, user_id=2, create_date="2022-01-01")TestModel.objects.create(num=54, user_id=2, create_date="2022-01-08")TestModel.objects.create(num=77, user_id=2, create_date="2022-01-16")

本篇笔记的目录如下:

distinct 单个字段distinct 多个字段count 字段去重后总数sum 某个字段总和group by 分组统计 countgroup by 分组统计 maxgroup by 分组统计 sumgroup by 分组统计 count + distinct1、distinct 单个字段

现在我们需要 user_id 这个字段进行去重处理,获取一个去重后的 user_id 的列表

使用 SQL 的话,大致如下:

select distinct user_id from blog_test;

使用 QuerySet 语句则是:

TestModel.objects.values_list("user_id", flat=True).distinct()
2、distinct 多个字段

假设需要对 user_id 和 create_date 这两个字段做去重处理,

使用 SQL 语句如下:

select distinct user_id, create_date from blog_test;

对应的 QuerySet 语句:

TestModel.objects.values("user_id").distinct()
3、count 字段去重后总数

比如我们想查看 2022-01-01 这天有多少不同 user_id 值的数据

select count(distinct user_id) from blog_test where create_date = "2022-01-01";

对应的 QuerySet 为:

TestModel.objects.filter(create_date="2022-01-01").values("user_id").distinct().count()
4、sum 某个字段总和

我们想查看 2022-01-01 这天 num 字段的数据的总和有多少:

select sum(num) from blog_test where create_date = "2022-01-01";

Django 语句:

from django.db.models import SumTestModel.objects.filter(create_date="2022-01-01").aggregate(sum_num=Sum("num"))# 返回值为 # {"sum_num": 243}
5、group by 分组统计 count

按照日期统计 user_id 的总数:

select create_date, count(user_id) from blog_test group by create_date;

Django 语句:

from django.db.models import CountTestModel.objects.values("create_date").annotate(count=Count("user_id"))
6、group by 分组统计 max

按照日期计算每一天最大的 num 的数据:

select create_date, max(num) from blog_test group by create_date;

Django 语句:

TestModel.objects.values("create_date").annotate(max_num=Max("num"))
7、group by 分组统计 sum

按照日期计算 num 的总数:

select create_date, sum(num) from blog_test group by create_date;

Django 语句:

from django.db.models import SumTestModel.objects.values("create_date").annotate(sum_num=Sum("num"))
8、group by 分组统计 count + distinct

如果是对需要对 user_id 进行去重处理的统计,SQL 如下:

select create_date, count(distinct user_id) from blog_test group by create_date;

Django 语句:

TestModel.objects.values("create_date").annotate(count=Count("user_id", distinct=True))

以上就是本篇笔记全部内容,接下来会是几个深入一点的知识点的介绍,比如一个 Model 示例 save() 方法的继承和修改、主键自增和字段更新的操作。

如果想获取更多相关文章,可扫码关注阅读:

关键词:

相关文章