本文首發(fā)于公眾號:Hunter后端
原文鏈接:Django筆記二十七之數據庫函數之文本函數
這篇筆記將介紹如何使用數據庫函數里的文本函數。
顧名思義,文本函數,就是針對文本字段進行操作的函數,如下是目錄匯總:
- Concat() —— 合并
- Left() —— 從左邊開始截取
- Length() —— 獲取字符串長度
- Lower() —— 小寫處理
- LPad() —— 從左邊填充指定字符串
- MD5() —— 獲取字符串MD5哈希值
- Repeat() —— 重復指定字段值
- Replace() —— 替換指定內容
- Reverse() —— 字段內容反轉返回
- StrIndex() —— 獲取第一個匹配指定字符串的下標
- SubStr() —— 字符串截取
- 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 系統操作的數據庫優(yōu)化做一次匯總。
如果想獲取更多后端相關文章,可掃碼關注閱讀:文章來源:http://www.zghlxwxcb.cn/news/detail-420879.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-420879.html
到了這里,關于Django筆記二十七之數據庫函數之文本函數的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!