Django筆記十七之group by 分組用法總結

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

一個非常簡單的小項目。 看到了楊旭大佬的教學視頻,自己跟著實現了一下,完善了一下游戲邏輯。 通過空格鍵進行控制。 游戲中可按 P 鍵 暫停/恢復 游戲 項目結構 · ├── Cargo.lock ├── Cargo.toml ├── src/ │ ├── main.rs │ ├──bird/ │ │ ...


本文首發於微信公眾號: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


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

-Advertisement-
Play Games
更多相關文章
  • 還在為npm i安裝大量依賴等待時間較長,npm扁平化node_modules依賴版本衝突在苦惱嗎,不用苦惱pnpm為你保駕護航 ...
  • Element Plus是一個用於Vue.js的UI組件庫,為開發人員提供了一組可重用和可定製化的組件,用於構建現代Web應用程式。它是流行的Element UI庫的擴展,重點是提高性能和可訪問性。 Element Plus包括廣泛的組件,如按鈕、表單、表格、對話框等。 除了常規的UI組件外,Ele ...
  • JavaScript字元串轉數字的5種方法及其陷阱 摘要 :JavaScript 是一個神奇的語言,字元串轉數字有 5 種方法,各有各的坑法! 原文: Converting Strings to Number in Javascript: Pitfalls 譯者: Fundebug 轉載地址: 本文 ...
  • #1、方法 const formatStr = (str) => { const value = str.replace( /[`:_~!@#$%^&*() \+ =<>?"{}|, \/ ;' \\ [ \] ·~!@#¥%……&*()—— \+ ={}|《》?:“”【】、;‘’,。、-]/g, ...
  • MVVM模式(Model-View-ViewModel):它的目標是將用戶界面(UI)的邏輯與業務邏輯分離。該模式的核心思想是將UI分為視圖(View)和視圖模型(ViewModel),並通過數據綁定實現二者之間的通信。 在MVVM模式中,視圖(View)表示用戶界面的呈現部分,視圖模型(ViewM ...
  • 本博文記錄CSS中比較常用的背景屬性,包括背景顏色:background-color、背景圖片:background-image、背景平鋪:background-repeat、背景位置:background-position和背景附著:background-attachment。同時記錄了背景色半透... ...
  • 本文分享自天翼雲開發者社區@《基於SpringBoot實現單元測試的多種情境/方法(二)》, 作者:才開始學技術的小白 1 Mock基礎回顧 在上一篇分享中我們詳細介紹了簡單的、用mock來模擬介面測試環境的方法,具體的使用樣例我們再回顧一下: 1.首先是最簡單的不需要傳參的示例,需要註意的是,可能 ...
  • 簡介 外觀模式(Facade Pattern),也叫門面模式,是一種結構型設計模式。它向現有的系統添加一個高層介面,隱藏子系統的複雜性,這個介面使得子系統更加容易使用。 如果你需要一個指向複雜子系統的直接介面,且該介面的功能有限,則可以使用外觀模式。或者需要將子系統組織為多層結構,可以使用外觀。 作 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...