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
使⽤字段+0处理,即: unit+0
sql
SELECT * FROM table_name WHERE rack = 'A03' ORDER BY unit+0;
结果只会对数字进⾏排序,⽽A,B,C,D并没有被排序
使⽤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
成功,结果真⾹!
基于SQL语句转换Django语句
from dels.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语句有的,它也不能少。关键⽅法annotate和Cast
应该还有更好的⽅法,欢迎指点。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。