Django笔记二十七之数据库函数之文本函数

本文首发于公众号: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.cnblogs.com/hunterxiong/p/17342326.html

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Django笔记二十七之数据库函数之文本函数 - Python技术站

(0)
上一篇 2023年4月20日
下一篇 2023年4月22日

相关文章

  • 详解Python自动化中这八大元素定位

    我来给您详细讲解Python自动化中这八大元素定位的攻略。 一、元素定位 元素定位是自动化测试中的一项基础,涉及到如何定位页面元素,并在后续操作中引用它们。 Python自动化中,我们一般会用到以下八大元素定位方式: 1. 通过ID定位元素 from selenium import webdriver driver = webdriver.Chrome() …

    python 2023年5月14日
    00
  • Pytorch中transforms.Resize()的简单使用

    下面是关于PyTorch中transforms.Resize()函数的详细讲解。 1. transforms.Resize()函数概述 transforms.Resize()函数是PyTorch中transforms模块提供的一个图像处理函数,它可以对图像进行缩放操作。具体来说,这个函数可以将输入图像的尺寸调整为给定的目标尺寸。 该函数的输入参数包括目标尺寸…

    python 2023年5月19日
    00
  • Python多线程 Queue 模块常见用法

    Python多线程 Queue 模块常见用法 多线程编程中,线程之间的通信是经常遇到的问题。Python中的Queue模块可以很好地解决这个问题。本文将详细讲解Queue模块的常用方法和使用场景。 基本用法 Queue模块提供了FIFO队列、LIFO队列,以及优先级队列三种数据结构。 import queue # 创建一个FIFO队列 fifo_queue …

    python 2023年5月18日
    00
  • 网站渗透常用Python小脚本查询同ip网站

    网站渗透常用Python小脚本查询同IP网站 本攻略将介绍如何使用Python编写小脚本查询同IP网站。我们将使用socket库获取网站的IP地址,并使用requests库发送HTTP请求,使用BeautifulSoup库解析HTML响应,以查找同IP网站。我们将提供两个示例代码,分别用于查询同IP网站和查询同IP网站的子域名。 安装所需库 在开始前,我们需…

    python 2023年5月15日
    00
  • Python时间戳转换为字符串与字符串转换为时间戳

    关于Python时间戳转换为字符串与字符串转换为时间戳的攻略,我可以提供如下内容: 时间戳转换为字符串 步骤: 1.引入time模块2.使用time模块的strftime()方法(时间戳转换为字符串) – 参数1:格式化字符串 – 参数2:时间元组(由时间戳转换得到) 示例: 下面是一个将时间戳转换为字符串的示例: import time # 获取当前时间戳…

    python 2023年6月2日
    00
  • Python实现登陆文件验证方法

    下面是“Python实现登陆文件验证方法”的完整攻略。 确定需求 根据题目要求,我们需要实现一个 Python 登陆文件验证的方法。具体来说,就是要编写一个 Python 程序来从文本文件中读取用户名和密码,将用户输入的用户名和密码与文件中的用户名和密码进行比较,如果匹配成功,就允许用户登陆,否则就提示用户名或密码错误。 设计思路 根据需求,我们可以设计以下…

    python 2023年6月2日
    00
  • Python面向对象编程(三)

    以下是关于 Python 面向对象编程(三)的完整攻略: 问题描述 在 Python 面向对象编程中,继承是重要的概念。继承允许我们创建一个新的类,该类继承了一个类的属性和方法。本文将介绍如何在 Python 中使用继承。 解决方法 使用以下步骤解决 Python 面向对象编程中的继承问题: 创建一个父类。 在 Python 中,可以使用 class 关键字…

    python 2023年5月13日
    00
  • python math模块的基本使用教程

    Python math模块的基本使用教程 简介 Python math模块是Python提供的用于数学计算的扩展模块,它包含了许多数学函数和常量,使得在Python中进行数学计算更加方便快捷。 常用函数 数值型变量处理函数 ceil() import math print(math.ceil(4.1)) # 输出 5 print(math.ceil(4.5)…

    python 2023年6月3日
    00
合作推广
合作推广
分享本页
返回顶部