Django筆記十六之aggregate聚合操作

来源:https://www.cnblogs.com/hunterxiong/archive/2023/04/05/17290995.html
-Advertisement-
Play Games

Week3 Exceptions Fuel Gauge 題目描述: 輸入分數字元串,判斷並輸出相應的百分數;特例不足1%輸出E,超出99%輸出F 思路: 1,從字元串中取出x,y; 2,按題中要求計算輸出; 題解: while True: try: ## 取出x,y x, z, y= input(" ...


本文首發於微信公眾號:Hunter後端
原文鏈接:Django筆記十六之aggregate聚合操作

這一篇筆記介紹一下關於聚合的操作,aggregate。

常用的聚合操作比如有平均數,總數,最大值,最小值等等

用到的 model 如下



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

聚合函數

  • Avg —— 平均數
  • Count —— 總數
  • Max —— 最大值
  • Min —— 最小值
  • Sum —— 總數

output_field —— 指定輸出的數據格式

以下介紹一下幾種聚合操作的例子,因為 Avg,Max,Min 都是一樣的操作方法,所以用一個函數來做示例。

獲取表中最大值:

from django.db.models import Max, Min, Avg

Book.objects.all().aggregate(Avg('price'))

對應的 SQL 為:

select avg(price) from blog_book;

返回的值為:

{'price__avg': Decimal('5.500000')}

指定聚合類型返回

因為 Book 中的 price 欄位是 Decimal 欄位,所以聚合之後返回的數據類型也是這個類型,如果想要更換成 Float 類型,可以用上 output_field 來指定輸出類型:

Book.objects.all().aggregate(Avg('price', output_field=models.FloatField()))

返回的結果就是:

{'price__avg': 5.5}

指定聚合欄位名稱

Book.objects.aggregate(avg_price=Avg("price"))

以上用的示例都是 Avg 平均數,更換成 最大值 Max,最小值 Min 都是可以的

多個聚合操作

假設我們不止需要平均數,還需要最大值,最小值等等,我們可以在一個語句里直接操作

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

關聯表的聚合操作

對於 Store model,他有一個多對多的 book 的關係,如果想獲取 Store 數據里,關聯的 Book 的最大的 Book 的 price 數據:

Store.objects.aggregate(min_price=Min("books__price"))

如果有多個錶鏈式關聯,也可以直接鏈式聚合獲取:

Store.objects.aggregate(youngest_age=Min("books__authors__age"))

以上就是本篇筆記的全部內容,其實還有一些聚合的操作,是關於 annotate 的一些用法示例,這裡不多贅述,有時間可以單獨開一個專門的筆記。

下一篇筆記將會對 SQL 中的 group by 用法在Django 中的對應操作做一個整體介紹。

如果想獲取更多相關文章,可掃碼關註閱讀:
image


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Android Banner - ViewPager 02 現在來給viewpager實現的banenr加上自動輪播 自動輪播的原理,使用handler的延遲消息來實現。 自動輪播實現如下內容 開始輪播&停止輪播 可配置輪播時長、輪播方向 通過自定義屬性來配置輪播時長,方向 感知生命周期,可見時開始 ...
  • 文件中引入JavaScript 嵌入到HTML文件中 在body或者head中添加script標簽 <script> var age = 10; console.log(age); </script> 引入js文件 創建一個js文件 var age = 20; console.log(age); 在 ...
  • 支付永遠是一個公司的核心領域,因為這是一個有交易屬性公司的命脈。那麼,支付系統到底長什麼樣,又是怎麼運行交互的呢?拋開帶有支付牌照的金融公司的支付架構,下述鏈路和系統組成基本上符合絕大多數支付場景。其實整體可以看成是交易核心+支付核心 兩個大系統。交易系統關聯了業務場景和底層支付,而支付系統完成了調 ...
  • Go語言流媒體開源項目 LAL 今天發佈了v0.34.3版本。 LAL 項目地址:https://github.com/q191201771/lal 老規矩,簡單介紹一下: ▦ 一. 音頻G711 新增了對音頻G711A/G711U(也被稱為PCMA/PCMU)的支持。主要表現在: ✒ 1) rtm ...
  • 一、將調試信息輸出到屏幕中 1.1 一般寫法 我們平常在寫代碼時,肯定會有一些調試信息的輸出: #include <stdio.h> #include <stdlib.h> int main() { char szFileName[] = "test.txt"; FILE *fp = fopen(s ...
  • FreeRTOS的heap_4記憶體管理演算法具有記憶體碎片合併的功能,可以有效防止記憶體碎片產生,使用First fit演算法,在實現上與C標準庫的malloc類似,但是效率更高且能進行碎片合併回收。以下是個人對源碼的解析,有空再補充詳細。 一、初始化 static void prvHeapInit( vo ...
  • JVM調優,其實就是調整SWT和FGC的過程 JVM記憶體模型 通過一張基礎的圖瞭解最簡單的JVM模型: 其實在jvm模型中,主要包含了我們常見的堆棧方法區等待--每個版本不同可能解釋有所不同,這裡預設以8版本為例: 首先給出官方文檔的解釋: https://docs.oracle.com/javas ...
  • 項目實例:- 命令行程式 一、實例:接收命令行參數 本章內容 12.1 接收命令行參數 12.2 讀取文件 12.3 重構:改進模塊和錯誤處理 12.4 使用 TDD(測試驅動開發)開發庫功能 12.5 使用環境變數 12.6 將錯誤消息寫入標準錯誤而不是標準輸出 創建項目 ~/rust ➜ car ...
一周排行
    -Advertisement-
    Play Games
  • 前言 本文介紹一款使用 C# 與 WPF 開發的音頻播放器,其界面簡潔大方,操作體驗流暢。該播放器支持多種音頻格式(如 MP4、WMA、OGG、FLAC 等),並具備標記、實時歌詞顯示等功能。 另外,還支持換膚及多語言(中英文)切換。核心音頻處理採用 FFmpeg 組件,獲得了廣泛認可,目前 Git ...
  • OAuth2.0授權驗證-gitee授權碼模式 本文主要介紹如何筆者自己是如何使用gitee提供的OAuth2.0協議完成授權驗證並登錄到自己的系統,完整模式如圖 1、創建應用 打開gitee個人中心->第三方應用->創建應用 創建應用後在我的應用界面,查看已創建應用的Client ID和Clien ...
  • 解決了這個問題:《winForm下,fastReport.net 從.net framework 升級到.net5遇到的錯誤“Operation is not supported on this platform.”》 本文內容轉載自:https://www.fcnsoft.com/Home/Sho ...
  • 國內文章 WPF 從裸 Win 32 的 WM_Pointer 消息獲取觸摸點繪製筆跡 https://www.cnblogs.com/lindexi/p/18390983 本文將告訴大家如何在 WPF 裡面,接收裸 Win 32 的 WM_Pointer 消息,從消息裡面獲取觸摸點信息,使用觸摸點 ...
  • 前言 給大家推薦一個專為新零售快消行業打造了一套高效的進銷存管理系統。 系統不僅具備強大的庫存管理功能,還集成了高性能的輕量級 POS 解決方案,確保頁面載入速度極快,提供良好的用戶體驗。 項目介紹 Dorisoy.POS 是一款基於 .NET 7 和 Angular 4 開發的新零售快消進銷存管理 ...
  • ABP CLI常用的代碼分享 一、確保環境配置正確 安裝.NET CLI: ABP CLI是基於.NET Core或.NET 5/6/7等更高版本構建的,因此首先需要在你的開發環境中安裝.NET CLI。這可以通過訪問Microsoft官網下載並安裝相應版本的.NET SDK來實現。 安裝ABP ...
  • 問題 問題是這樣的:第三方的webapi,需要先調用登陸介面獲取Cookie,訪問其它介面時攜帶Cookie信息。 但使用HttpClient類調用登陸介面,返回的Headers中沒有找到Cookie信息。 分析 首先,使用Postman測試該登陸介面,正常返回Cookie信息,說明是HttpCli ...
  • 國內文章 關於.NET在中國為什麼工資低的分析 https://www.cnblogs.com/thinkingmore/p/18406244 .NET在中國開發者的薪資偏低,主要因市場需求、技術棧選擇和企業文化等因素所致。歷史上,.NET曾因微軟的閉源策略發展受限,儘管後來推出了跨平臺的.NET ...
  • 在WPF開發應用中,動畫不僅可以引起用戶的註意與興趣,而且還使軟體更加便於使用。前面幾篇文章講解了畫筆(Brush),形狀(Shape),幾何圖形(Geometry),變換(Transform)等相關內容,今天繼續講解動畫相關內容和知識點,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 什麼是委托? 委托可以說是把一個方法代入另一個方法執行,相當於指向函數的指針;事件就相當於保存委托的數組; 1.實例化委托的方式: 方式1:通過new創建實例: public delegate void ShowDelegate(); 或者 public delegate string ShowDe ...