当前位置: 首页 > 后端技术 > Python

DjangoNote27:数据库函数的Text函数

时间:2023-03-26 18:57:05 Python

本篇笔记将介绍如何在数据库函数中使用text函数。顾名思义,文本函数是对文本字段进行操作的函数。以下是目录汇总:Concat()-合并Left()-从左边截取Length()-获取字符串长度Lower()-小写处理LPad()-从左边填充指定字符串MD5()-获取字符串的MD5哈希值Repeat()-重复指定字段值Replace()-替换指定内容Reverse()-反转字段内容并返回StrIndex()-获取匹配指定字符串的第一个下标SubStr()-字符串截取Trim()-去除给定字段中的空格这篇笔记记录中有很多函数,大家可以慢慢看,慢慢测试,有些函数左右都有对应的操作。我这里只介绍一种。其他对应的函数,除了函数名称不同,功能相反外,其他用法相同。这次我们使用Author模型:,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()函数就是合并的函数。它接受至少两个文本字段或表达式参数,并将它们组合成一个字段返回。示例如下:fromdjango.db.models.functionsimportConcatfromdjango.db.modelsimportCharField,Valuefromblog.modelsimportAuthorauthor=Author.objects.create(name="hunter",alias="alias")author=作者。objects.annotate(concat_name=Concat('name',Value('_'),'alias',output_field=CharField())).get(id=author.id)print(author.concat_name)在我们装饰的例子中name字段、别名字段和_用Value()函数,传给Concat(),通过output_field指定输出字符串类型,三者合并为一个字符串返回注:如果TextField()和CharField()字段,那么output_field必须是TextField()2,Left()——从左边截取输入两个参数,一个是指定字段,一个是指定长度,表示字段将从左边开始输入开始截取指定长度并返回如下示例:fromdjango.db.models.functionsimportLeftauthor=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。以下是使用示例:来自django。db.models.functionsimportLengthauthor=Author.objects.annotate(name_length=Length("name"),email_length=Length("email")).get(id=10)print(author.name_length)#returnnumberprint(author.email_length)#字段值为null,所以这里返回None也可以用于搜索。假设我要查找name字段长度大于3的数据,可以这样实现:fromdjango.db.modelsimportCharFieldfromdjango.db.models.functionsimportLengthCharField.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()——小写处理接受文本字段名称或表达式作为参数,然后以小写形式返回。以下是使用示例:fromdjango.db.models.functionsimportLowerAuthor.objects.create(name="HUNTER")author=Author.objects.annotate(name_lower=Lower("name")).get(id=11)print(author.name_lower)后面跟Length()函数一样,也可以用注册的方式搜索:fromdjango.db.modelsimportCharFieldfromdjango.db.models.functionsimportLowerCharField.register_lookup(Lower)authors=Author.objects.filter(name__lower="hunter")print(authors.values("name"))同理,大写函数为django.db.models.functions.Upper()5,LPad()——PadthespecifiedstringfromtheleftLPad()表示从左边填充指定的字符串,接受三个参数:第一个参数为字段名或表达式,第二个参数为要填充的长度,参数的name为长度,需要指定一个值。第三个参数叫做fill_text,值为填充的内容。默认为空字符串。假设我们需要将abc填充到name字段中,需要填充到10个字符的长度。如果name的原始值为hunter,则结果将是abcahunter。如果要填充的值很短,则会重复填充。如果很长,它会被截取并填充。刚才的例子,第二次填充时,再次重复abc会超过10个长度限制,所以abc被截取这是一个示例用法:fromdjango.db.models.functionsimportLPadfromdjango.db.modelsimportValueAuthor.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)#HUNTprint(author.name_2)#abHUNTERprint(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哈希值fromdjango.db.models.functionsimportMD5author=Author.objects.annotate(name_md5=MD5('name')).get(id=11)print(author.name_md5)7.repeat()——重复指定字段值。repeat(expression,number)接受字段参数和重复次数,从django.db.models.functi中返回重复number次数据后的字段内容onsimportRepeatAuthor.objects.create(name="Python")#id=13author=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(''))进行替换,即将表达式字段的值为text的所有内容替换为替换的内容,并replacement的默认值为空字符在下面的例子中,我们将name字段中的所有Ma字符串更新为Jefromdjango.db.models.functionsimportReplacefromdjango.db.modelsimportValueAuthor.objects.create(name="Match-Mary")#id=14Author.objects.filter(id=14).update(name=Replace('name',Value('Ma'),Value('Je')))author=Author.objects.get(id=14)print(author.name)#Jetch-Jery9,Reverse()——字段内容反向返回接受字段或表达式作为参数,反转原来的字段内容并返回fromdjango.db.models.functionsimportReverseauthor=Author.objects.annotate(reverse_name=Reverse('name')).get(id=11)print(author.rreverse_name)10、strIndex()-获取匹配指定字符串的第一个下标接受两个参数,一个参数是字段名,第二个参数是要匹配的子字符串,如果子字符串在字段中匹配到,就会返回第一个匹配项的子字符串的下标。注1:匹配上的下标从1开始计数,没有匹配则返回0注2:这个匹配的过程是忽略大小写fromdjango.db.models.functionsimportStrIndexfromdjango.db.modelsimportValueauthor=Author.objects.create(name="thIsisaTest")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、是字符串匹配忽略大小写,下标从1开始,所以是3print(author.test_index)#11print(author.xx_index)#0找不到对应的字符串,所以返回0,可以根据0判断该字段是否包含特定字符flag,这个操作可以用来过滤该字段是否包含特定字符串数据,根据返回结果是否为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开始计数),要计数的长度表示某个字段,从指定的下标开始,截取一个指定长度的字符串fromdjango.db.models.functionsimportSubstr#改成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()——RemovespacesfromagivenfieldRemovespacesfromleftandrightsides删除空格给定字段的Author.objects.create(name="testtrim")#id=15fromdjango.db.models.functionsimportTrimauthor=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系统运行的数据库优化

猜你喜欢