国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Django筆記二十七之數據庫函數之文本函數

這篇具有很好參考價值的文章主要介紹了Django筆記二十七之數據庫函數之文本函數。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

本文首發(fā)于公眾號: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 系統操作的數據庫優(yōu)化做一次匯總。

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

Django筆記二十七之數據庫函數之文本函數文章來源地址http://www.zghlxwxcb.cn/news/detail-420879.html

到了這里,關于Django筆記二十七之數據庫函數之文本函數的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • Django筆記二十二之多數據庫操作

    Django筆記二十二之多數據庫操作

    本文首發(fā)于公眾號:Hunter后端 原文鏈接:Django筆記二十二之多數據庫操作 這一篇筆記介紹一下多數據庫操作。 在第十篇筆記的時候,簡單介紹過 using() 的使用方法,多個數據庫就是通過 using(db_alias) 的方式來來指定選中的數據庫,這里介紹一下同步庫表結構時候的操作。 定

    2023年04月11日
    瀏覽(88)
  • Django筆記二十八之數據庫查詢優(yōu)化匯總

    Django筆記二十八之數據庫查詢優(yōu)化匯總

    本文首發(fā)于公眾號:Hunter后端 原文鏈接:Django筆記二十八之數據庫查詢優(yōu)化匯總 這一篇筆記將從以下幾個方面來介紹 Django 在查詢過程中的一些優(yōu)化操作,有一些是介紹如何獲取 Django 查詢轉化的 sql 語句,有一些是理解 QuerySet 是如何獲取數據的。 以下是本篇筆記目錄: 性

    2023年04月22日
    瀏覽(87)
  • Django筆記二十一之使用原生SQL查詢數據庫

    Django筆記二十一之使用原生SQL查詢數據庫

    本文首發(fā)于公眾號:Hunter后端 原文鏈接:Django筆記二十一之使用原生SQL查詢數據庫 Django 提供了兩種方式來執(zhí)行原生 SQL 代碼。 一種是使用 raw() 函數,一種是 使用 connection.cursor()。 但是官方還是推薦在使用原生 SQL 之前,盡量的先去探索一下 QuerySet 提供的各種 API。 目前而言

    2023年04月10日
    瀏覽(98)
  • Django筆記之數據庫函數之日期函數

    Django筆記之數據庫函數之日期函數

    日期函數主要介紹兩個大類,Extract() 和 Trunc() Extract() 函數作用是提取日期,比如我們可以提取一個日期字段的年份,月份,日等數據 Trunc() 的作用則是截取,比如? 2022-06-18 12:12:12 ,我們可以根據需求獲取到日期 2020-06-18,或者更細粒度到時分秒 這次我們用到下面這個 mode

    2024年02月13日
    瀏覽(92)
  • (二十七)Flask之數據庫連接池DBUtils庫

    (二十七)Flask之數據庫連接池DBUtils庫

    ????作者介紹:【孤寒者】—CSDN全棧領域優(yōu)質創(chuàng)作者、HDZ核心組成員、華為云享專家Python全棧領域博主、CSDN原力計劃作者 ???? 本文已收錄于Flask框架從入門到實戰(zhàn)專欄 :《Flask框架從入門到實戰(zhàn)》 ???? 熱門專欄推薦 :《Python全棧系列教程》、《爬蟲從入門到精通系列

    2024年04月13日
    瀏覽(15)
  • 圖數據庫_Neo4j學習cypher語言_常用函數_關系函數_字符串函數_聚合函數_數據庫備份_數據庫恢復---Neo4j圖數據庫工作筆記0008

    圖數據庫_Neo4j學習cypher語言_常用函數_關系函數_字符串函數_聚合函數_數據庫備份_數據庫恢復---Neo4j圖數據庫工作筆記0008

    然后再來看一些常用函數,和字符串函數,這里舉個例子,然后其他的 類似 ? 可以看到substring字符串截取函數 ? 可以看到截取成功 ? 聚合函數 ? 這里用了一個count(n) 統計函數,可以看到效果 ? 關系函數,我們用過就是id(r) 可以取出對應的r的id來這樣..

    2024年02月12日
    瀏覽(41)
  • 珍藏多年的MySQL函數大全筆記,掌握數據庫真不難

    珍藏多年的MySQL函數大全筆記,掌握數據庫真不難

    做程序員的誰會離得開數據庫呢? 今天就來分享一下我整理的MySQL的常用函數,基本上囊括了平時要用的函數,它們已經陪我走過了不少年頭了,風里來雨里去,縫縫補補又幾年,希望能幫到你們! 如果數據庫函數你能用得好,其他的東西也就水到渠成了。 序號 函數 說明

    2023年04月23日
    瀏覽(21)
  • 【MySQL數據庫 | 第十七篇】索引以及索引結構介紹

    【MySQL數據庫 | 第十七篇】索引以及索引結構介紹

    目錄 前言: 索引簡介:? 索引結構: ? ? ? ? ??二叉樹索引結構 ? ? ? ??Tree(普通二叉樹) ? ? ? ??B-Tree(多路平衡查找樹) ? ? ? ??B+Tree ? ? ? ???哈希索引數據結構 總結: 在實際生活中,我們對SQL語句進行優(yōu)化實際上有很大一部分都是對索引進行優(yōu)化,因此對索引

    2024年02月09日
    瀏覽(40)
  • 數據庫管理-第七十七期 再探分布式(20230523)

    數據庫管理-第七十七期 再探分布式(20230523)

    上一次系統探討分布式數據庫還是在第三十六期,經過大半年的“進步”加上中間參加了不少國產數據庫的研討會或者交流,對分布式數據庫的理解還是有了些許進步。 最近出現了所謂的“新詞”:單機分布式,簡言之就是一臺服務器運行多個數據庫實例,通過spanner框架等

    2024年02月08日
    瀏覽(21)
  • MySQL高級第十七篇:數據庫主從復制原理及保證數據一致性

    MySQL高級第十七篇:數據庫主從復制原理及保證數據一致性

    在實際工作中,我們常常將Redis作為緩存與MySQL來配合使用,當有請求的時候,首先會從緩存中進行查找,如果存在就直接取出,如果不存在再訪問數據庫。 這樣就提升了讀取的效率,也減少了對后端數據庫的訪問壓力。 此外,對于一般數據庫應用而言,都是 讀多寫少 的,

    2023年04月25日
    瀏覽(28)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包