共计 2439 个字符,预计需要花费 7 分钟才能阅读完成。
这篇笔记介绍 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 分组统计 count
- group by 分组统计 max
- group by 分组统计 sum
- 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() 办法的继承和批改、主键自增和字段更新的操作。
本文首发于自己微信公众号:Django 笔记。
原文链接:Django 笔记十七之 group by 分组用法总结
如果想获取更多相干文章,可扫码关注浏览:
正文完