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

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

2023-04-22 07:29:19 後端開發

本文首發于公眾號: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/550762.html

標籤:Python

上一篇:圖片的腐蝕,膨脹,開丶閉運算,梯度計算,禮帽與黑帽

下一篇:返回列表

標籤雲
其他(157775) 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:29:19 more
  • 圖片的腐蝕,膨脹,開丶閉運算,梯度計算,禮帽與黑帽

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

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

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

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

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

    uj5u.com 2023-04-22 07:28:43 more
  • django使用多個資料庫實作

    一、說明: 在開發 Django 專案的時候,很多時候都是使用一個資料庫,即 settings 中只有 default 資料庫,但是有一些專案確實也需要使用多個資料庫,這樣的專案,在資料庫配置和使用的時候,就比較麻煩一點。 二、Django使用多個資料庫中settings中的DATABASES的設定 ......

    uj5u.com 2023-04-22 07:27:52 more
  • 【K哥爬蟲普法】微信公眾號爬蟲構成不正當競爭,爬蟲er面對金山,如

    我國目前并未出臺專門針對網路爬蟲技術的法律規范,但在司法實踐中,相關判決已屢見不鮮,K 哥特設了“K哥爬蟲普法”專欄,本欄目通過對真實案例的分析,旨在提高廣大爬蟲工程師的法律意識,知曉如何合法合規利用爬蟲技術,警鐘長鳴,做一個守法、護法、有原則的技術人員。 案情介紹 2011年1月微信問世,騰訊公司 ......

    uj5u.com 2023-04-22 07:22:31 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:18:40 more
  • 網路流的C++代碼實作與程序講解

    網路流是一種非常重要的圖論演算法,它在許多實際問題中得到廣泛應用。本文將介紹網路流演算法的C++代碼實作與程序講解。 演算法概述 網路流演算法是通過將圖中的邊看作流量通道,將圖的點看作流量的起點或終點,來求解圖中的最大或最小流量的問題。它是一種非常重要的最優化演算法,廣泛應用于圖論、運籌學、計算機網路等領域。 ......

    uj5u.com 2023-04-21 09:15:02 more
  • java反射的一些理解

    首先簡單介紹下java反射的應用場景:java反射多用于框架設計中。 其次,簡述下框架:可重復用的,用來提高編程效率的代碼。一些重復性的作業不需要在去開發,直接利用框架集成起來,用的時候呼叫框架,傳遞引數等等。 再次,介紹下java反射獲取類物件的三種方式: Class.forName("全限定類名 ......

    uj5u.com 2023-04-21 09:14:58 more
  • java反射的一些理解

    首先簡單介紹下java反射的應用場景:java反射多用于框架設計中。 其次,簡述下框架:可重復用的,用來提高編程效率的代碼。一些重復性的作業不需要在去開發,直接利用框架集成起來,用的時候呼叫框架,傳遞引數等等。 再次,介紹下java反射獲取類物件的三種方式: Class.forName("全限定類名 ......

    uj5u.com 2023-04-21 09:13:56 more