Django笔记十七之group by 分组用法总结
  pwciJmn0pWhj 2023年11月02日 50 0

本文首发于微信公众号: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 Sum
TestModel.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() 方法的继承和修改、主键自增和字段更新的操作。

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

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

推荐阅读
  2Fnpj8K6xSCR   2024年05月17日   80   0   0 Python
  xKQN3Agd2ZMK   2024年05月17日   65   0   0 Python
  fwjWaDlWXE4h   2024年05月17日   31   0   0 Python
  YpHJ7ITmccOD   2024年05月17日   34   0   0 Python
pwciJmn0pWhj