主頁 > 後端開發 > Django筆記二十七之資料庫函式之文本函式

Django筆記二十七之資料庫函式之文本函式

2023-04-22 07:35:22 後端開發

本文首發于公眾號:Hunter后端
原文鏈接:Django筆記二十七之資料庫函式之文本函式

這篇筆記將介紹如何使用資料庫函式里的文本函式,

顧名思義,文本函式,就是針對文本欄位進行操作的函式,如下是目錄匯總:

  1. Concat() —— 合并
  2. Left() —— 從左邊開始截取
  3. Length() —— 獲取字串長度
  4. Lower() —— 小寫處理
  5. LPad() —— 從左邊填充指定字串
  6. MD5() —— 獲取字串MD5哈希值
  7. Repeat() —— 重復指定欄位值
  8. Replace() —— 替換指定內容
  9. Reverse() —— 欄位內容反轉回傳
  10. StrIndex() —— 獲取第一個匹配指定字串的下標
  11. SubStr() —— 字串截取
  12. Trim() —— 去除給定欄位空格

這一篇筆記記錄的函式有點多,可以慢慢看,慢慢測驗,其中有一些函式是左右都有對應操作的,我這里只介紹一個,另一個對應的函式除了函式名不一樣和作用相反外,用法都是一樣的,

我們這次用到的是 Author 這個 model:

class Author(models.Model):
    name = models.CharField(max_length=200)
    email = models.EmailField(null=True, default=None)
    age = models.IntegerField(null=True, blank=True)
    alias = models.CharField(max_length=50, null=True, blank=True)
    goes_by = models.CharField(max_length=50, null=True, blank=True)

1、Concat() —— 合并

Concat() 函式,是合并的作用,接受至少兩個文本欄位或者運算式引數,將其合并成一個欄位回傳,

示例如下:

from django.db.models.functions import Concat
from django.db.models import CharField, Value
from blog.models import Author

author = Author.objects.create(name="hunter", alias="alias")


author = Author.objects.annotate(
    concat_name=Concat('name', Value('_'), 'alias', output_field=CharField()
    )
).get(id=author.id)


print(author.concat_name)

在示例中,我們將 name 欄位和 alias 欄位以及 _ 這個字串用 Value() 函式修飾,傳入 Concat(),并通過 output_field 來指定輸出字串型別,將三者合并成一個字串回傳

注意: 如果是將 TextField() 和 CharField() 欄位進行合并,那么 output_field 必須是 TextField()

2、Left() —— 從左邊開始截取

輸入兩個引數,一個是指定欄位,一個是指定的長度,表示將對該欄位從左邊開始截取指定長度回傳

以下是示例:

from django.db.models.functions import Left

author = Author.objects.annotate(left_three_str=Left('name', 3)).get(id=10)

print(author.left_three_str)

注意一下,我在示例中使用到的 id 的值都是在我自己資料庫的 id值,讀者在自己測驗的時候,需要替換成自己資料的真實 id

同理,django.db.models.functions.Right 是從右邊開始截取

3、Length() —— 獲取字串長度

接受文本欄位或者運算式作為引數,回傳字串長度

如果欄位或者運算式為 null,那么在 Python 里會回傳 None

以下是使用示例:

from django.db.models.functions import Length

author = Author.objects.annotate(name_length=Length("name"), email_length=Length("email")).get(id=10)

print(author.name_length)
# 回傳數字

print(author.email_length)
# 欄位值為 null, 所以回傳 None

這里也可以用于搜索,假設說我想搜索 name 欄位長度大于3的資料,可以如下實作:

from django.db.models import CharField
from django.db.models.functions import Length

CharField.register_lookup(Length)

authors = Author.objects.filter(name__length__gt=3)
print(authors.count())

或者 annotate() 出一個新欄位,然后進行 filter()

Author.objects.annotate(name_length=Length("name")).filter(name_length__gt=3)

4、Lower() —— 小寫處理

接受文本欄位名或者運算式作為引數傳入,然后將其小寫化處理回傳

以下是使用示例:

from django.db.models.functions import Lower

Author.objects.create(name="HUNTER")

author = Author.objects.annotate(name_lower=Lower("name")).get(id=11)

print(author.name_lower)

跟 Length() 函式一樣,也可以使用注冊的方式來搜索:

from django.db.models import CharField
from django.db.models.functions import Lower

CharField.register_lookup(Lower)

authors = Author.objects.filter(name__lower="hunter")
print(authors.values("name"))

同理,大寫化的函式為 django.db.models.functions.Upper()

5、LPad() —— 從左邊填充指定字串

LPad() 意思為從左邊填充指定字串,接受三個引數:

第一個引數為欄位名或運算式

第二個引數為需要填充到的長度,引數名為 length,需要指定值

第三個引數名為 fill_text,值為填充的內容,默認為空字串

假設我們需要將 abc 填充到 name 欄位,需要填充到 10 個字符長度

那么如果 name 的原始值為 hunter,結果則會是 abcahunter

如果需要填充的值短了,那么就會重復填充,如果長了,就會被截取填充,在剛剛的例子里,第二次填充的時候,再重復一次 abc 則超出 10個長度的限制,所以 abc 被截取了,

以下是使用示例:

from django.db.models.functions import LPad
from django.db.models import Value

Author.objects.create(name="HUNTER")

author = Author.objects.annotate(
    name_1=LPad('name', 4, fill_text=Value('abc')),
    name_2=LPad('name', 8, fill_text=Value('abc')),
    name_3=LPad('name', 16, fill_text=Value('abc'))
).get(id=11)


print(author.name_1)
# HUNT

print(author.name_2)
# abHUNTER

print(author.name_3)
# abcabcabcaHUNTER

更新操作

我們還可以利用 LPad() 函式來對欄位進行更新操作

Author.objects.filter(id=11).update(name=LPad('name', 10, Value('abv')))
author = Author.objects.get(id=11)
print(author.name)

這段代碼的含義為,將 name 欄位原有值的左邊填充 abc 字串填充到10個字符長度后更新到 name 欄位

同理,還有一個從右邊開始填充的函式 RPad(),也是同樣的用法

6、MD5() —— 獲取字串MD5哈希值

接受單個文本欄位或者運算式作為引數,回傳字串的 MD5 哈希值

from django.db.models.functions import MD5

author = Author.objects.annotate(name_md5=MD5('name')).get(id=11)

print(author.name_md5)

7、Repeat() —— 重復指定欄位值

Repeat(expression, number)
接受欄位引數,和重復的次數,回傳欄位內容重復 number 遍之后的資料

from django.db.models.functions import Repeat

Author.objects.create(name="Python")
# id = 13

author = Author.objects.annotate(repeat_name=Repeat("name", 3)).get(id=13)
print(author.repeat_name)

# 列印出的值為:PythonPythonPython

更新欄位資料

將 id=13 的資料的 name 欄位重復三遍之后更新到該欄位:

Author.objects.filter(id=13).update(name=Repeat("name", 3))

8、Replace() —— 替換指定內容

Replace(expression, text, replacement=Value(''))
替換,即將 expression 欄位的值的所有內容為 text 的替換成 replacement 的內容,replacement 默認為空字串

在下面的例子中,我們將 name 欄位中所有的 Ma 字串更新為 Je

from django.db.models.functions import Replace
from django.db.models import Value

Author.objects.create(name="Match-Mary")
# id = 14

Author.objects.filter(id=14).update(name=Replace('name', Value('Ma'), Value('Je')))

author = Author.objects.get(id=14)

print(author.name)
# Jetch-Jery

9、Reverse() —— 欄位內容反轉回傳

接受欄位或者運算式為引數,將原欄位內容倒序后回傳

from django.db.models.functions import Reverse

author = Author.objects.annotate(reverse_name=Reverse('name')).get(id=11)
print(author.reverse_name)

10、StrIndex() —— 獲取第一個匹配指定字串的下標

接受兩個引數,一個引數為欄位名,第二個引數為需要匹配的子串

如果子串在欄位中被匹配上了,將會回傳第一個匹配上的子串的下標

注意1:匹配上的下標是從1開始計數的,如果沒有匹配上,那就回回傳0

注意2:這個匹配的程序是忽略大小寫的

from django.db.models.functions import StrIndex
from django.db.models import Value

author = Author.objects.create(name="thIs is a Test")

author = Author.objects.annotate(
    is_index=StrIndex("name", Value("is")),
    test_index=StrIndex("name", Value("test")),
    xx_index=StrIndex("name", Value("xx"))
).get(id=author.id)


print(author.is_index)
# 3,is 字串匹配忽略大小寫,下標從1開始,所以是3

print(author.test_index)
# 11 

print(author.xx_index)
# 0 找不到對應的字串,所以回傳 0,可以根據 0 這個標志位來判斷欄位中是否包含某個特定字符

而這個操作我們可以用來篩選欄位中是否包含某個特定字串的資料,根據回傳的結果是否為 0 來判斷:

authors = Author.objects.annotate(ter_index=StrIndex("name", Value("ter"))).filter(ter_index__gt=0)
print(authors.count())

11、SubStr() —— 字串截取

SunStr(expression, pos, length=None)

這是一個字串截取的函式,給定一個欄位名,和開始的下標(下標從1開始計數),和需要計數的長度

表示將某欄位,從指定下標開始,截取指定長度的字串


from django.db.models.functions import Substr

# 將 name 欄位 從 第二個字符開始往后截取三個長度的字符
author = Author.objects.annotate(name_sub_str=Substr('name', 2, 3)).get(id=12)

print(author.name_sub_str)

可以用于直接更新:

Author.objects.filter(id=12).update(name=Substr('name', 2, 3))

12、Trim() —— 去除給定欄位空格

去除空格給定欄位左右兩邊的空格

Author.objects.create(name=" test trim ")  # id = 15

from django.db.models.functions import Trim

author = Author.objects.annotate(trim_name=Trim("name")).get(id=15)

print(author.trim_name)

也可以直接用于更新:

Author.objects.filter(id=15).update(name=Trim("name"))

同理,還有去除左邊空格的函式 LTrim() 和 去除右邊空格的函式 RTrim()

以上就是本篇筆記全部內容,下一篇將會是比較重要也比較長的一篇筆記,將會對 Django 系統操作的資料庫優化做一次匯總,

如果想獲取更多后端相關文章,可掃碼關注閱讀:

image

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/550780.html

標籤:其他

上一篇:Rust中的Copy和Clone

下一篇:返回列表

標籤雲
其他(157793) Python(38089) JavaScript(25379) Java(17985) C(15215) 區塊鏈(8256) C#(7972) AI(7469) 爪哇(7425) MySQL(7135) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4555) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1959) Web開發(1951) python-3.x(1918) HtmlCss(1917) 弹簧靴(1913) C++(1910) xml(1889) PostgreSQL(1872) .NETCore(1854) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 【C++】Microsoft C++、C 和匯編程式檔案

    ......

    uj5u.com 2020-09-10 00:57:23 more
  • 例外宣告

    相比于斷言適用于排除邏輯上不可能存在的狀態,例外通常是用于邏輯上可能發生的錯誤。 例外宣告 Item 1:當函式不可能拋出例外或不能接受拋出例外時,使用noexcept 理由 如果不打算拋出例外的話,程式就會認為無法處理這種錯誤,并且應當盡早終止,如此可以有效地阻止例外的傳播與擴散。 示例 //不可 ......

    uj5u.com 2020-09-10 00:57:27 more
  • Codeforces 1400E Clear the Multiset(貪心 + 分治)

    鏈接:https://codeforces.com/problemset/problem/1400/E 來源:Codeforces 思路:給你一個陣列,現在你可以進行兩種操作,操作1:將一段沒有 0 的區間進行減一的操作,操作2:將 i 位置上的元素歸零。最終問:將這個陣列的全部元素歸零后操作的最少 ......

    uj5u.com 2020-09-10 00:57:30 more
  • UVA11610 【Reverse Prime】

    本人看到此題沒有翻譯,就附帶了一個自己的翻譯版本 思考 這一題,它的第一個要求是找出所有 $7$ 位反向質數及其質因數的個數。 我們應該需要質數篩篩選1~$10^{7}$的所有數,這里就不慢慢介紹了。但是,重讀題,我們突然發現反向質數都是 $7$ 位,而將它反過來后的數字卻是 $6$ 位數,這就說明 ......

    uj5u.com 2020-09-10 00:57:36 more
  • 統計區間素數數量

    1 #pragma GCC optimize(2) 2 #include <bits/stdc++.h> 3 using namespace std; 4 bool isprime[1000000010]; 5 vector<int> prime; 6 inline int getlist(int ......

    uj5u.com 2020-09-10 00:57:47 more
  • C/C++編程筆記:C++中的 const 變數詳解,教你正確認識const用法

    1、C中的const 1、區域const變數存放在堆疊區中,會分配記憶體(也就是說可以通過地址間接修改變數的值)。測驗代碼如下: 運行結果: 2、全域const變數存放在只讀資料段(不能通過地址修改,會發生寫入錯誤), 默認為外部聯編,可以給其他源檔案使用(需要用extern關鍵字修飾) 運行結果: ......

    uj5u.com 2020-09-10 00:58:04 more
  • 【C++犯錯記錄】VS2019 MFC添加資源不懂如何修改資源宏ID

    1. 首先在資源視圖中,添加資源 2. 點擊新添加的資源,復制自動生成的ID 3. 在解決方案資源管理器中找到Resource.h檔案,編輯,使用整個專案搜索和替換的方式快速替換 宏宣告 4. Ctrl+Shift+F 全域搜索,點擊查找全部,然后逐個替換 5. 為什么使用搜索替換而不使用屬性視窗直 ......

    uj5u.com 2020-09-10 00:59:11 more
  • 【C++犯錯記錄】VS2019 MFC不懂的批量添加資源

    1. 打開資源頭檔案Resource.h,在其中預先定義好宏 ID(不清楚其實ID值應該設定多少,可以先新建一個相同的資源項,再在這個資源的ID值的基礎上遞增即可) 2. 在資源視圖中選中專案資源,按F7編輯資源檔案,按 ID 型別 相對路徑的形式添加 資源。(別忘了先把檔案拷貝到專案中的res檔案 ......

    uj5u.com 2020-09-10 01:00:19 more
  • C/C++編程筆記:關于C++的參考型別,專供新手入門使用

    今天要講的是C++中我最喜歡的一個用法——參考,也叫別名。 參考就是給一個變數名取一個變數名,方便我們間接地使用這個變數。我們可以給一個變數創建N個參考,這N + 1個變數共享了同一塊記憶體區域。(參考型別的變數會占用記憶體空間,占用的記憶體空間的大小和指標型別的大小是相同的。雖然參考是一個物件的別名,但 ......

    uj5u.com 2020-09-10 01:00:22 more
  • 【C/C++編程筆記】從頭開始學習C ++:初學者完整指南

    眾所周知,C ++的學習曲線陡峭,但是花時間學習這種語言將為您的職業帶來奇跡,并使您與其他開發人員區分開。您會更輕松地學習新語言,形成真正的解決問題的技能,并在編程的基礎上打下堅實的基礎。 C ++將幫助您養成良好的編程習慣(即清晰一致的編碼風格,在撰寫代碼時注釋代碼,并限制類內部的可見性),并且由 ......

    uj5u.com 2020-09-10 01:00:41 more
最新发布
  • Django筆記二十七之資料庫函式之文本函式

    本文首發于公眾號:Hunter后端 原文鏈接:Django筆記二十七之資料庫函式之文本函式 這篇筆記將介紹如何使用資料庫函式里的文本函式。 顧名思義,文本函式,就是針對文本欄位進行操作的函式,如下是目錄匯總: Concat() —— 合并 Left() —— 從左邊開始截取 Length() —— ......

    uj5u.com 2023-04-22 07:35:22 more
  • Rust中的Copy和Clone

    1.Copy和Clone Rust中的Copy和Clonetrait都允許創建型別實體的副本。它們都提供了一種復制型別實體的方法,但它們之間存在一些重要的區別。了解這些區別有助更好地使用這兩個特征。 2. Copytrait Copytrait允許按位復制型別的實體。這意味著當您將一個變數賦值給另一 ......

    uj5u.com 2023-04-22 07:35:17 more
  • LocalDateTime

    // LocalDateTime類: 獲取日期時間資訊。格式為 2018-09-06T15:33:56.750 // 得到指定日期時間 LocalDateTime dateTime = LocalDateTime.of(1985, 4, 15, 12, 12, 12); // 得到當前日期時間 Lo ......

    uj5u.com 2023-04-22 07:35:14 more
  • 圖片的腐蝕,膨脹,開丶閉運算,梯度計算,禮帽與黑帽

    1 腐蝕操作 用于圖片的去毛刺,內容削減 1 #腐蝕操作 2 #cv2.erode(src,kernel,iterations) 3 #src是圖片數字化陣列 4 #kernel則是一個盒,對該盒內的像素進行復試操作,值越小腐蝕能力越狠 5 #iterations是一個迭代次數,就是說你對這個圖片進 ......

    uj5u.com 2023-04-22 07:35:10 more
  • java獲取到heapdump檔案后,如何快速分析?

    原創:扣釘日記(微信公眾號ID:codelogs),歡迎分享,非公眾號轉載保留此宣告。 簡介 在之前的OOM問題復盤之后,本周,又一Java服務出現了記憶體問題,這次問題不嚴重,只會觸發堆記憶體占用高報警,沒有觸發OOM,但好在之前的復盤中總結了dump腳本,會在堆占用高時自動執行jstack與jmap ......

    uj5u.com 2023-04-22 07:34:51 more
  • Kaggle上使用Tensorboard

    Kaggle上使用Tensorboard 1. 前言 想在Kaggle上使用Tensorboard,找了一圈。 參考了Kaggle上的一個Code:Tensorboard on Kaggle 但發現有些變化,Code中用到的內網穿透工具Ngrok需要加一個Token,所以需要注冊一個Ngrok賬號, ......

    uj5u.com 2023-04-22 07:32:44 more
  • java -- Stream流

    注意:Stream和IO流(InputStream/OutputStream)沒有任何關系,請暫時忘記對傳統IO流的固有印象 傳統集合的多步遍歷代碼 幾乎所有的集合(如Collection介面或Map介面等)都支持直接或間接的遍歷操作。而當我們需要對集合中的元素進行操作的時候,除了必需的添加、洗掉、 ......

    uj5u.com 2023-04-22 07:32:35 more
  • boot-admin整合flowable官方editor-app原始碼進行BPMN2-0建模(續)

    boot-admin整合flowable官方editor-app原始碼進行BPMN2-0建模(續) 書接上回 專案原始碼倉庫github 專案原始碼倉庫gitee boot-admin 是一款采用前后端分離模式、基于SpringCloud微服務架構的SaaS后臺管理框架。系統內置基礎管理、權限管理、運行管 ......

    uj5u.com 2023-04-22 07:32:26 more
  • odoo 開發入門教程系列-QWeb簡史

    QWeb簡史 到目前為止,我們的房地產模塊的界面設計相當有限。構建串列視圖很簡單,因為只需要欄位串列。表單視圖也是如此:盡管使用了一些標記,如<group>或<page>,但在設計方面幾乎沒有什么可做的。 然而,如果我們想給我們的應用程式一個獨特的外觀,就必須更進一步,能夠設計新的視圖。此外,PDF ......

    uj5u.com 2023-04-22 07:32:12 more
  • win10環境下 VMware Workstation Pro 安裝centos7無法上網

    一、安裝centos7 網上類似的教程太多了,我就不一一寫了,提供兩個網址,先按照教程安裝 VMware Workstation Pro ,秘鑰在第二個鏈接里面(親測可用), 安裝完VMware在根據教程安裝centos7,網路配置安裝教程中不全,可參考如下 虛擬機安裝教程 VMware Works ......

    uj5u.com 2023-04-22 07:31:39 more