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 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

原文链接:https://www.cnblogs.com/hunterxiong/p/17297775.html

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Django笔记十七之group by 分组用法总结 - Python技术站

(0)
上一篇 2023年4月18日
下一篇 2023年4月18日

相关文章

  • Python秒算24点实现及原理详解

    Python秒算24点实现及原理详解 24点游戏是一种常见的纸牌游戏,玩家需要从一副牌中随机抽取4牌,然后通过加、减、乘、除等运算符,使得这4张牌的结果为24。在这篇文章中,我们将介绍如何使用Python实现24点游戏,并详细讲解实现原理。 实现原理 24点游戏的实现原理比较简单,我们可以使用递归的方式枚举所有可能的运算符组合,然后计算结果,判断是否为24。…

    python 2023年5月14日
    00
  • Python+Appium新手教程

    Python+Appium新手教程攻略 概述 本教程将介绍如何使用Python和Appium来进行移动端自动化测试。我们将介绍Appium的安装和配置、Python代码编写以及执行测试的方法。 Appium的安装和配置 确保你安装了Node.js。可以在命令行里输入以下命令来检查是否安装成功: node -v 安装Appium 可以通过以下命令安装Appiu…

    python 2023年5月19日
    00
  • Python实现杰卡德距离以及环比算法讲解

    Python实现杰卡德距离以及环比算法讲解 杰卡德距离和环比算法是常用的数据分析算法,可以用于计算两个集合之间的相似度和计算环比增长率。在Python中,可以使用numpy库实现卡德离和环比算法。本文将详细讲解Python实现杰卡德距离和环比算法的整个攻略,包括法原理、Python实现过程和示例。 算法原理 杰卡德距离 杰卡德距离是一种常用的似度度量方法,可…

    python 2023年5月14日
    00
  • Python深入06——python的内存管理详解

    Python深入06 — Python的内存管理详解 1. 引言 本文将深入介绍 Python 中内存管理的一些知识,包括 Python 的垃圾回收机制、对象引用计数、循环引用等问题。同时,我们将对 Python 的内存管理做一些实践和示例。希望读者能够通过本文了解 Python 内存管理的基本原理,提升 Python 程序的性能和稳定性。 2. Pyth…

    python 2023年6月3日
    00
  • Python request设置HTTPS代理代码解析

    以下是关于“Python request设置HTTPS代理代码解析”的完整攻略: Python request设置HTTPS代理代码解析 在Python中,我们可以使用requests库发送HTTP请求。如果需要设置HTTPS代理,我们可以使用proxies参数。以下是Python request设置HTTPS代理代码解析的攻略。 设置单个HTTPS代理 我…

    python 2023年5月15日
    00
  • Python学习之异常中的finally使用详解

    Python学习之异常中的finally使用详解 什么是异常处理? 在 Python 编程中,当遇到错误或异常时,我们通常会使用异常处理来处理这些错误或异常。 异常处理是指程序在运行时检测到错误或异常时,会采取相应的措施来处理异常,以保证程序的正常运行和稳定性。 Python 中提供了 try-except-finally 语句用于异常处理。 finally…

    python 2023年5月13日
    00
  • python调用机器喇叭发出蜂鸣声(Beep)的方法

    Python调用机器喇叭发出蜂鸣声(Beep)有多种方法,本文将介绍两种最为常见的方式。 方法一:winsound库 winsound库是Python自带的Windows声音库,其中包含Beep方法,可以直接调用。以下是使用winsound库进行Beep调用的示例代码: import winsound winsound.Beep(500, 1000) # 前…

    python 2023年5月23日
    00
  • 详解Python 优化存储和精度

    Python 优化存储和精度 的攻略分为以下几个部分: 一、优化存储 1.使用元组 Tuple 替代列表 List List 是 Python 最常用的序列类型之一,但是它在存储元素时会消耗大量内存,因为它是动态数组类型,可以随意添加、删除元素,而这些操作需要修改内存分配情况。相比之下,Tuple 是静态的、不可变的数组类型,它在存储元素时不需要进行这些操作…

    python-answer 2023年3月25日
    00
合作推广
合作推广
分享本页
返回顶部