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
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...