写点什么

Django 笔记十七之 group by 分组用法总结

作者:Hunter熊
  • 2023-04-26
    北京
  • 本文字数:1522 字

    阅读完需:约 5 分钟

Django笔记十七之group by 分组用法总结

本文首发于公众号: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")
复制代码


本篇笔记的目录如下:


  1. distinct 单个字段

  2. distinct 多个字段

  3. count 字段去重后总数

  4. sum 某个字段总和

  5. group by 分组统计 count

  6. group by 分组统计 max

  7. group by 分组统计 sum

  8. group by 分组统计 count + distinct

1、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 Sum
TestModel.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 Count
TestModel.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() 方法的继承和修改、主键自增和字段更新的操作。

发布于: 刚刚阅读数: 3
用户头像

Hunter熊

关注

公众号:Hunter后端 2018-09-17 加入

Python后端工程师,欢迎互相沟通交流

评论

发布
暂无评论
Django笔记十七之group by 分组用法总结_Python_Hunter熊_InfoQ写作社区