当前位置: 首页 > news >正文

Django Aggregation 使用指南

Django Aggregation 使用指南

在构建Django应用时,我们经常需要对数据库中的数据进行汇总或聚合操作。例如,计算某个字段的平均值、最大值或最小值。这篇文章将详细介绍如何在Django中使用聚合查询,并结合实例进行说明。

聚合查询简介

Django提供了强大的数据库查询API,可以创建、检索、更新和删除单个对象。除此之外,有时我们需要通过汇总或聚合对象集合来获取派生值。本文将介绍如何使用Django查询来生成和返回聚合值。

示例模型

我们以以下模型为例,这些模型用于跟踪一系列在线书店的库存:

from django.db import modelsclass Author(models.Model):name = models.CharField(max_length=100)age = models.IntegerField()class Publisher(models.Model):name = models.CharField(max_length=300)class Book(models.Model):name = models.CharField(max_length=300)pages = models.IntegerField()price = models.DecimalField(max_digits=10, decimal_places=2)rating = models.FloatField()authors = models.ManyToManyField(Author)publisher = models.ForeignKey(Publisher, on_delete=models.CASCADE)pubdate = models.DateField()class Store(models.Model):name = models.CharField(max_length=300)books = models.ManyToManyField(Book)

常见聚合查询示例

以下是一些常见的聚合查询示例:

  1. 计算所有书籍的总数:

    Book.objects.count()
    
  2. 计算某出版社出版的书籍总数:

    Book.objects.filter(publisher__name="BaloneyPress").count()
    
  3. 计算所有书籍的平均价格:

    from django.db.models import Avg
    Book.objects.aggregate(Avg("price"))
    
  4. 计算所有书籍的最高价格:

    from django.db.models import Max
    Book.objects.aggregate(Max("price"))
    
  5. 计算每个出版社的书籍数量:

    from django.db.models import Count
    pubs = Publisher.objects.annotate(num_books=Count("book"))
    
  6. 按书籍数量排序的前5个出版社:

    pubs = Publisher.objects.annotate(num_books=Count("book")).order_by("-num_books")[:5]
    

聚合方法详解

Django提供了两种生成聚合值的方法:

  1. 对整个查询集生成汇总值:

    from django.db.models import Avg
    Book.objects.aggregate(Avg("price"))
    

    这将计算所有书籍价格的平均值。

  2. 对查询集中的每个对象生成独立的汇总值:

    from django.db.models import Count
    books = Book.objects.annotate(num_authors=Count("authors"))
    

    这将为每本书添加一个字段,表示其作者的数量。

高级用法

  1. 结合多个聚合:

    from django.db.models import Avg, Max, Min
    Book.objects.aggregate(Avg("price"), Max("price"), Min("price"))
    
  2. 基于注释值进行过滤:

    Book.objects.annotate(num_authors=Count("authors")).filter(num_authors__gt=1)
    
  3. 注释和过滤的顺序:

    注释和过滤的顺序对查询结果有很大影响。例如:

    Publisher.objects.annotate(num_books=Count("book")).filter(book__rating__gt=3.0)
    

    与:

    Publisher.objects.filter(book__rating__gt=3.0).annotate(num_books=Count("book"))
    

    这两种查询的结果可能会有所不同,因为注释和过滤的顺序不同。

结合具体实例

我们通过以下代码实现了对Twitter数据的聚合查询:

from django.db.models import Count, Avg
from .models import TwAuthors, TwTweets# 获取每个作者的平均推文数
authors = TwAuthors.objects.annotate(avg_tweets=Avg('twtweets__id'))# 获取推文数量最多的前5个作者
top_authors = TwAuthors.objects.annotate(num_tweets=Count('twtweets')).order_by('-num_tweets')[:5]

这段代码展示了如何利用Django的聚合查询功能,获取每个作者的平均推文数,并找出推文数量最多的前5个作者。

annotateaggregate:区别

在Django中,annotateaggregate是用于生成汇总值的两种不同方法,主要区别在于它们的作用范围和结果类型。

1. annotate

  • 作用范围:对每个对象单独计算汇总值。
  • 返回结果:返回一个新的QuerySet,每个对象都会附带一个额外的属性,该属性是通过计算汇总值生成的。
  • 使用场景:当你需要对查询集中的每个对象进行汇总计算时使用。例如,你可能想知道每本书有多少个作者。
示例代码:
from django.db.models import Count# 查询每本书的作者数量
books = Book.objects.annotate(num_authors=Count('authors'))
for book in books:print(book.name, book.num_authors)

2. aggregate

  • 作用范围:对整个QuerySet进行汇总计算。
  • 返回结果:返回一个字典,键是汇总值的名称,值是计算的汇总值。
  • 使用场景:当你需要对整个查询集进行汇总计算时使用。例如,你可能想知道所有书籍的平均价格。
示例代码:
from django.db.models import Avg# 计算所有书籍的平均价格
average_price = Book.objects.aggregate(Avg('price'))
print(average_price)

结合实例

假设我们有一个包含书籍信息的数据库,并且我们想获取一些汇总信息:

使用annotate

我们想知道每个出版社出版的书籍数量:

from django.db.models import Countpublishers = Publisher.objects.annotate(num_books=Count('book'))
for publisher in publishers:print(publisher.name, publisher.num_books)

每个Publisher对象将会有一个num_books属性,表示该出版社出版的书籍数量。

使用aggregate

我们想知道所有书籍的最高价格、最低价格和平均价格:

from django.db.models import Avg, Max, Minprice_summary = Book.objects.aggregate(max_price=Max('price'),min_price=Min('price'),avg_price=Avg('price')
)
print(price_summary)

返回的price_summary是一个字典,包含了所有书籍的最高价格、最低价格和平均价格。

结论

Django的聚合查询功能非常强大,可以帮助我们高效地从数据库中提取所需的汇总数据。通过合理使用这些功能,我们可以大大简化数据统计和分析的工作。

希望这篇文章能帮助你更好地理解和使用Django的聚合查询。如果你有任何问题或建议,欢迎留言讨论。

相关文章:

Django Aggregation 使用指南

Django Aggregation 使用指南 在构建Django应用时,我们经常需要对数据库中的数据进行汇总或聚合操作。例如,计算某个字段的平均值、最大值或最小值。这篇文章将详细介绍如何在Django中使用聚合查询,并结合实例进行说明。 聚合查询简介 Dja…...

嵌入式学习——Linux操作系统——文件编程练习

1.使用fread和fwrite方式完成任意普通文件的拷贝功能。 模拟 文件下载 #include <stdio.h>void do_copy(FILE *fp_s,FILE *fp_d) {char buf[100] {0};int ret;while (ret fread(buf,sizeof(char),sizeof(buf),fp_s))fwrite(buf,sizeof(char),ret,fp_d); }//./a.out sr…...

用JavaScript实现了一个简单的图像坐标点标注工具

这段代码实现了一个简单的图像标注工具&#xff0c;允许用户在加载的图像上进行点选标注&#xff0c;并且通过右键确认一个点序列来形成一个多边形。 标注效果如下 实现代码如下 <!DOCTYPE html> <html lang"en"> <head><meta charset"U…...

Pytorch深度解析:Transformer嵌入层源码逐行解读

前言 本部分博客需要先阅读博客&#xff1a; 《Transformer实现以及Pytorch源码解读&#xff08;一&#xff09;-数据输入篇》 作为知识储备。 Embedding使用方式 如下面的代码中所示&#xff0c;embedding一般是先实例化nn.Embedding(vocab_size, embedding_dim)。实例化的…...

HSP_10章 Python面向对象编程oop_基础部分

文章目录 P107 类与实例的关系1.类与实例的关系示意图2.类与实例的代码分析 P109 对象形式和传参机制1. 类与对象的区别和联系2. 属性/成员变量3. 类的定义和使用4. 对象的传递机制 P110 对象的布尔值P111 成员方法1. 基本介绍2. 成员方法的定义和基本使用3.注意事项和使用细节…...

JavaWeb系列十七: jQuery选择器 上

jQuery选择器 jQuery基本选择器jquery层次选择器基础过滤选择器内容过滤选择器可见度过滤选择器 选择器是jQuery的核心, 在jQuery中, 对事件处理, 遍历 DOM和Ajax 操作都依赖于选择器jQuery选择器的优点 $(“#id”) 等价于 document.getElementById(“id”);$(“tagName”) 等价…...

Gone框架介绍30 - 使用`goner/gin`提供Web服务

gone是可以高效开发Web服务的Golang依赖注入框架 github地址&#xff1a;https://github.com/gone-io/gone 文档地址&#xff1a;https://goner.fun/zh/ 使用goner/gin提供Web服务 文章目录 使用goner/gin提供Web服务注册相关的Goners编写Controller挂载路由路由处理函数io.Rea…...

Lipowerline5.0 雷达电力应用软件下载使用

1.配网数据处理分析 针对配网线路点云数据&#xff0c;优化了分类算法&#xff0c;支持杆塔、导线、交跨线、建筑物、地面点和其他线路的自动分类&#xff1b;一键生成危险点报告和交跨报告&#xff1b;还能生成点云数据采集航线和自主巡检航线。 获取软件安装包联系邮箱:289…...

STM32学习之一:什么是STM32

目录 1.什么是STM32 2.STM32命名规则 3.STM32外设资源 4. STM32的系统架构 5. 从0到1搭建一个STM32工程 学习stm32已经很久了&#xff0c;因为种种原因&#xff0c;也有很久一段时间没接触过stm32了。等我捡起来的时候&#xff0c;发现很多都已经忘记了&#xff0c;重新捡…...

AI绘画Stable Diffusion 超强一键去除图片中的物体,免费使用!

大家好&#xff0c;我是设计师阿威 在生成图像时总有一些不完美的小瑕疵&#xff0c;比如多余的物体或碍眼的水印&#xff0c;它们破坏了图片的美感。但别担心&#xff0c;今天我们将介绍一款神奇的工具——sd-webui-cleaner&#xff0c;它可以帮助我们使用Stable Diffusion轻…...

零基础STM32单片机编程入门(一)初识STM32单片机

文章目录 一.概要二.单片机型号命名规则三.STM32F103系统架构四.STM32F103C8T6单片机启动流程五.STM32F103C8T6单片机主要外设资源六.编程过程中芯片数据手册的作用1.单片机外设资源情况2.STM32单片机内部框图3.STM32单片机管脚图4.STM32单片机每个管脚可配功能5.单片机功耗数据…...

Github上前十大开源Rust项目

在github上排名前十的Rust开源项目整理出来与大家共享&#xff0c;以当前的Star数为准。 Deno Deno 是 V8 上的安全 TypeScript 运行时。Deno 是一个建立在V8、Rust和Tokio之上的 JavaScript、TypeScript 和 WebAssembly 的运行时环境&#xff0c;具有自带安全的设置和出色的开…...

硬件开发笔记(二十):AD21导入外部下载的元器件原理图库、封装库和3D模型

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/139707771 长沙红胖子Qt&#xff08;长沙创微智科&#xff09;博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV…...

竞赛选题 python opencv 深度学习 指纹识别算法实现

1 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; python opencv 深度学习 指纹识别算法实现 &#x1f947;学长这里给一个题目综合评分(每项满分5分) 难度系数&#xff1a;3分工作量&#xff1a;4分创新点&#xff1a;4分 该项目较为新颖…...

RK3568开发笔记(三):瑞芯微RK3588芯片介绍,入手开发板的核心板介绍

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/139905873 长沙红胖子Qt&#xff08;长沙创微智科&#xff09;博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV…...

EtherCAT主站IgH解析(二)-- 如何将Igh移植到Linux/Windows/RTOS等多操作系统

版权声明&#xff1a;本文为本文为博主原创文章&#xff0c;转载请注明出处 https://www.cnblogs.com/wsg1100 如有错误&#xff0c;欢迎指正。 本文简单介绍如何将 igh 移植到 zephyr、freertos、rtems、rtthread等RTOS &#xff0c;甚至 windows 上。 ##前言 目前&#xff0…...

ansible copy模块参选选项

copy模块用于将文件从ansible控制节点&#xff08;管理主机&#xff09;或者远程主机复制到远程主机上。其操作类似于scp&#xff08;secure copy protocol&#xff09;。 关键参数标红。 参数&#xff1a; src:&#xff08;source&#xff1a;源&#xff09; 要复制到远程…...

展厅设计主要的六大要素

1、从创意开始 展示设计的开始必须创意在先。根据整体的风格思路进行创意&#xff0c;首先要考虑的是主体的造型、大小高度位置以及它和周围展厅的关系。另外其他道具设计制作与运作方式也必须在创意中有明确的体现。 2、平面感 平面感是指对展示艺术设计平面图纸审美和功能两个…...

【数据结构与算法】最小生成树,Prim算法,Kruskal算法 详解

最小生成树的实际应用背景。 最节省经费的前提下&#xff0c;在n个城市之间建立通信联络网。 Kruskal算法&#xff08;基于并查集&#xff09; void init() {for (int i 1; i < n; i) {pre[i] i;} }ll root(ll a) {ll i a;while (pre[i] ! i) {i pre[i];}return i p…...

【启明智显产品分享】Model3工业级HMI芯片详解系列专题(三):安全、稳定、高防护

芯片作为电子设备的核心部件&#xff0c;&#xff0c;根据不同的应用领域被分为不同等级。工业级芯片适用于工业自动化、控制系统和仪器仪表等领域&#xff0c;对芯片的安全、稳定、防护能力等等有着较高的要求。这些芯片往往需要具备更宽的工业温度范围&#xff0c;能够在更恶…...

(二)TensorRT-LLM | 模型导出(v0.20.0rc3)

0. 概述 上一节 对安装和使用有个基本介绍。根据这个 issue 的描述&#xff0c;后续 TensorRT-LLM 团队可能更专注于更新和维护 pytorch backend。但 tensorrt backend 作为先前一直开发的工作&#xff0c;其中包含了大量可以学习的地方。本文主要看看它导出模型的部分&#x…...

Opencv中的addweighted函数

一.addweighted函数作用 addweighted&#xff08;&#xff09;是OpenCV库中用于图像处理的函数&#xff0c;主要功能是将两个输入图像&#xff08;尺寸和类型相同&#xff09;按照指定的权重进行加权叠加&#xff08;图像融合&#xff09;&#xff0c;并添加一个标量值&#x…...

蓝牙 BLE 扫描面试题大全(2):进阶面试题与实战演练

前文覆盖了 BLE 扫描的基础概念与经典问题蓝牙 BLE 扫描面试题大全(1)&#xff1a;从基础到实战的深度解析-CSDN博客&#xff0c;但实际面试中&#xff0c;企业更关注候选人对复杂场景的应对能力&#xff08;如多设备并发扫描、低功耗与高发现率的平衡&#xff09;和前沿技术的…...

AI编程--插件对比分析:CodeRider、GitHub Copilot及其他

AI编程插件对比分析&#xff1a;CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展&#xff0c;AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者&#xff0c;分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...

全志A40i android7.1 调试信息打印串口由uart0改为uart3

一&#xff0c;概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本&#xff1a;2014.07&#xff1b; Kernel版本&#xff1a;Linux-3.10&#xff1b; 二&#xff0c;Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01)&#xff0c;并让boo…...

Python 包管理器 uv 介绍

Python 包管理器 uv 全面介绍 uv 是由 Astral&#xff08;热门工具 Ruff 的开发者&#xff09;推出的下一代高性能 Python 包管理器和构建工具&#xff0c;用 Rust 编写。它旨在解决传统工具&#xff08;如 pip、virtualenv、pip-tools&#xff09;的性能瓶颈&#xff0c;同时…...

【VLNs篇】07:NavRL—在动态环境中学习安全飞行

项目内容论文标题NavRL: 在动态环境中学习安全飞行 (NavRL: Learning Safe Flight in Dynamic Environments)核心问题解决无人机在包含静态和动态障碍物的复杂环境中进行安全、高效自主导航的挑战&#xff0c;克服传统方法和现有强化学习方法的局限性。核心算法基于近端策略优化…...

淘宝扭蛋机小程序系统开发:打造互动性强的购物平台

淘宝扭蛋机小程序系统的开发&#xff0c;旨在打造一个互动性强的购物平台&#xff0c;让用户在购物的同时&#xff0c;能够享受到更多的乐趣和惊喜。 淘宝扭蛋机小程序系统拥有丰富的互动功能。用户可以通过虚拟摇杆操作扭蛋机&#xff0c;实现旋转、抽拉等动作&#xff0c;增…...

零知开源——STM32F103RBT6驱动 ICM20948 九轴传感器及 vofa + 上位机可视化教程

STM32F1 本教程使用零知标准板&#xff08;STM32F103RBT6&#xff09;通过I2C驱动ICM20948九轴传感器&#xff0c;实现姿态解算&#xff0c;并通过串口将数据实时发送至VOFA上位机进行3D可视化。代码基于开源库修改优化&#xff0c;适合嵌入式及物联网开发者。在基础驱动上新增…...

保姆级【快数学会Android端“动画“】+ 实现补间动画和逐帧动画!!!

目录 补间动画 1.创建资源文件夹 2.设置文件夹类型 3.创建.xml文件 4.样式设计 5.动画设置 6.动画的实现 内容拓展 7.在原基础上继续添加.xml文件 8.xml代码编写 (1)rotate_anim (2)scale_anim (3)translate_anim 9.MainActivity.java代码汇总 10.效果展示 逐帧…...