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

科技资讯 投稿 13900 0 评论

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

原文链接:Django笔记十七之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 单个字段
  1. distinct 多个字段
  2. count 字段去重后总数
  3. sum 某个字段总和
  4. group by 分组统计 count
  5. group by 分组统计 max
  6. group by 分组统计 sum
  7. group by 分组统计 count + distinct

1、distinct 单个字段

使用 SQL 的话,大致如下:

select distinct user_id from blog_test;

使用 QuerySet 语句则是:

TestModel.objects.values_list("user_id", flat=True.distinct(

2、distinct 多个字段

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

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

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

赞同 (76) or 分享 (0)
游客 发表我的评论   换个身份
取消评论

表情
(0)个小伙伴在吐槽