Django筆記十四之統計總數、最新紀錄和空值判斷等功能

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

如果一個BEAN類上加了@Transactional,則預設的該類及其子類的公開方法均會開啟事務,但有時某些業務場景下某些公開的方法可能並不需要事務,那這種情況該如何做呢? 常規的做法: 針對不同的場景及事務傳播特性,定義不同的公開方法【哪怕是同一種業務】,併在方法上添加@Transactional ...


本篇筆記將介紹一些 Django 查詢中統計總數、最新紀錄和空值判斷等功能。

  1. count
  2. in_bulk
  3. latest、earliest
  4. first、last
  5. exists
  6. contains、icontains
  7. gt、gte、lt、lte
  8. startswith、istartswith
  9. isnull

1、count

返回查詢的 QuerySet 的總數。

比如想查詢 Blog 下 name = 'hunter' 的總數:

Blog.objects.filter(name="hunter").count()

返回的結果直接是一個整數,類似的 SQL 代碼如下:

select count(*) from blog_blog where name = 'hunter';

2、in_bluk

返回一個 dict,key 為我們指定的欄位名的值,value 為這個欄位名所在 object 數據。

比如我們需要查詢 Blog 這個 model 下 name 為 "hunter", "jack" 的數據,可以如下實現:

Blog.objects.in_bulk(["hunter", "jack"], field_name="name")

返回的數據如下:

{'hunter': <Blog: Blog object (1)>, 'jack': <Blog: Blog object (2)>}

但是需要註意,field_name 這個欄位必須有唯一鍵的約束,即:

class Blog(models.Model):
    name = models.CharField(max_length=100, unique=True)
    tagline = models.TextField()

不指定 field_name
如果不指定 field_name 的值的話,那麼則會預設第一個參數列表的 value 值為 id:

Blog.objects.in_bulk([1, 2])

{1: <Blog: Blog object (1)>, 2: <Blog: Blog object (2)>}

不傳參數

如果函數里不傳參數,則預設以 field_name="id" 返回所有數據:

Blog.objects.in_bulk()

參數為空

如果函數里的參數為空,則返回空:

Blog.objects.in_bulk([])

3、latest、earliest

latest() 和 earliest() 一樣,都是按照指定欄位排序後返回最新的,或者最早的一條數據,返回的是 model 的一個實例。

前面介紹在 model 的 Meta 里如果給 get_latest_by 指定了欄位,那麼 latest() 就可以不加參數,預設按照 get_latest_by 的參數進行排序獲取數據。

否則必須在 latest() 里指定欄位。

用法如下:

entry_obj = Entry.objects.latest('pub_date)

entry_obj = Entry.objects.latest('pub_date', '-expire_date')

系統會按照 pub_date 欄位進行排序,然後返回最近的一條數據。

註意:這個操作和 get() 方法一樣,如果表裡不存在數據,使用 latest() 函數就會報錯。

處理 null 值
不同的資料庫對 null 值的處理是不一樣的,mysql 對 null 的排序會比非null值更高,

所以,在 mysql 中如果想排除掉 null 值,可以在 filter() 中去除這些數據:

Entry.objects.filter(pub_date__isnull=False).latest('pub_date')

latest() 是返回最新的一條數據

earliest() 則是返回最舊的一條數據。

4、first、last

返回符合條件的第一條數據:

Entry.objects.first()

也可以加上filter 和 排序條件:

entry = Entry.objects.filter(id__gte=12).order_by("pub_date").first()

註意: 如果沒有符合條件的數據,返回的結果可能是 None

last() 則是返回最後一條數據。

5、exists

檢測數據是否存在,返回布爾型結果。


is_exist = Blog.objects.filter(id=1).exists()

判斷某種條件的數據是否存在,可以使用這種方式查詢。

查詢的結果可以有多個,只要結果數 >= 1,返回即為 True。

6、contains、icontains

contains 意思為包含指定字元串,用法如下:

Blog.objects.filter(name__contains="hunter")

對應的 SQL 為:

select * from blog_blog where name like binary '%hunter%'

因為 MySQL 中的 like 是忽略大小寫的,所以通過 like binary 來強制不忽略大小寫。

而 icontains 的含義和 contains 一致,不過是忽略大小寫的:

Blog.objects.filter(name__icontains="hunter")

上面的語句中,name 欄位內容包含 Hunter、HUNTER、hUnTER 等任何中的都可以被匹配上,
對應的 SQL 為:

select * from blog_blog where name like '%hunter%'

7、gt、gte、lt、lte

gt: greater than,大於
gte: greater than or equal to 大於等於
lt: less than 小於
lte: less than or equal to 小於等於

用法示例如下:

Blog.objects.filter(id__gt=12)

對應的 SQL 為:

select * from blog_blog where id > 12

8、startswith、istartswith

startswith 以指定字元串為開頭,跟 python 里的用法類似

python 用法:

is_right = "abc".startswth("ab")

返回的 is_right 是一個 布爾型數據,表示是否以什麼為開頭。

Django 里的用法是:

Blog.objects.filter(name__startswith="hunter")

返回一個 QuerySet,對應的 SQL 是:

select * from blog_blog where name like binary 'hunter%'

startswith 是區分大小寫的,istartswith 則是忽略大小寫的用法

9、isnull

判斷欄位值是否為 null。

比如我們要取出 Enyry 表裡所有 pub_date 欄位為 null 的數據:

Entry.objects.filter(pub_date__isnull=True)

如果是取出所有欄位值不為空的數據:

Entry.objects.filter(pub_date__isnull=False)

以上就是本篇筆記全部內容,下一篇筆記將介紹model 查詢的範圍和日期的篩選功能。

本文首發於本人微信公眾號:Hunter後端

原文鏈接:Django筆記十四之統計總數、最新紀錄和空值判斷等功能

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


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

-Advertisement-
Play Games
更多相關文章
  • 前言 在開發過程中,取消需求是很常見的,但很容易被忽略。然而,取消需求的好處也很大。例如,在頁面中會發送很多請求。如果頁面被切走並處於不可見狀態,就需要取消未完成的請求任務。如果未及時取消,則可能會導致以下負面影響: 消耗用戶額外數據流量。 任務回調持有全局上下文變數,未及時釋放存在記憶體泄漏風險 異 ...
  • 前言 唯傑地圖VJMAP 為CAD圖或自定義地圖格式WebGIS可視化顯示開發提供的一站式解決方案,支持的格式如常用的AutoCAD的DWG格式文件、GeoJSON等常用GIS文件格式,它使用 WebGL矢量圖塊和自定義樣式呈現互動式地圖, 提供了全新的大數據可視化可視化功能。 唯傑地圖可視化平臺旨 ...
  • 目標:用三種方式實現簡易的計算器(計算屬性,監聽器,方法) 1.創建html,導入vue,實例化vue對象。 <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title></title> <script type="text/javas ...
  • 本博文介紹CSS三大特性之一:優先順序。 1 規則 (1)若選擇器相同,則執行層疊性(層疊性:給相同的選擇器設置相同的樣式,則“後來居上”,後面設置的樣式會覆蓋前面設置的樣式); (2)若選擇器不同,則有優先順序。 2 選擇器權重 常見的選擇器權重如下表: 選擇器 權重 繼承或者*(通配符) 0,0,0 ...
  • RocketMQ 是大家耳熟能詳的消息隊列,開源項目 rocketmq-spring 可以幫助開發者在 Spring Boot 項目中快速整合 RocketMQ。 這篇文章會介紹 Spring Boot 項目使用 rocketmq-spring SDK 實現消息收發的操作流程,同時筆者會從開發者的角 ...
  • Java 8 中提供了許多函數式介面,包括Function、Consumer、Supplier、Predicate 等等。這 4 個介面就是本篇將要分享的內容 ...
  • SpringCloud基本介紹 SpringCloud官方文檔 1.提出問題 先思考一個問題,沒有微服務技術,是不是程式員就不能開發大型項目? 是可以的,對大型項目進行模塊劃分,對各個模塊進行實現。但模塊之間更多地是以API調用完成,耦合度較高,不利於拓展和維護(在沒有微服務技術時,很多大型項目就已 ...
  • 電腦網路基礎,考驗一個程式員的基本功,也能更快的篩選出更優秀的人才。 說說TCP的三次握手 假設發送端為客戶端,接收端為服務端。開始時客戶端和服務端的狀態都是CLOSED。 第一次握手:客戶端向服務端發起建立連接請求,客戶端會隨機生成一個起始序列號x,客戶端向服務端發送的欄位中包含標誌位SYN=1 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...