Django开发之字母和数字的混合字符串排序

版本

Django 2.2.3
Python 3.8.8
MariaDB 5.5.64

场景

左图为数据库数据的原始存放,可以看到默认unit字段是没有排序的

unit字段是属于字母和数字的混合字符串

实现的效果为右图,unit既按照数字进行排序:先1/2,3/4,...,9/10再11/12,,又按照同数字时字母排序:27/28-A,27/28-B

Django开发之字母和数字的混合字符串排序   Django开发之字母和数字的混合字符串排序

使用字段+0处理,即: unit+0

sql

SELECT * FROM table_name WHERE rack = ‘A03‘ ORDER BY unit+0;

结果只会对数字进行排序,而A,B,C,D并没有被排序

Django开发之字母和数字的混合字符串排序

使用Cast转换类型,即:CAST(unit AS UNSIGNED)

sql

SELECT * FROM table_name WHERE rack = ‘A03‘ ORDER BY CAST(unit AS UNSIGNED)

 结果只会对数字进行排序,而A,B,C,D并没有被排序

Django开发之字母和数字的混合字符串排序 

 

使用Cast转换类型和默认排序,即:CAST(unit AS UNSIGNED),unit

sql

SELECT * FROM table_name WHERE rack = ‘A03‘ ORDER BY CAST(unit AS UNSIGNED), unit

 成功,结果真香!

Django开发之字母和数字的混合字符串排序

 

基于SQL语句转换Django语句

from django.db.models.functions import Cast
tns = TableName.objects.filter(rack=‘A03‘).annotate(unit_int=Cast(‘unit‘, IntegerField())).order_by(‘unit_int‘, ‘unit‘)
print(tns)

 先对unit字段进行转换成整型进行排序,再按照unit进行排序

 

总结

不得不说Django真的很强大,什么都想好了。既然SQL语句有的,它也不能少。

关键方法annotateCast

 

应该还有更好的方法,欢迎指点。

 

Django开发之字母和数字的混合字符串排序

上一篇:sql 查询某个字段出现的次数


下一篇:vector(可变数组) 用于UDP通信