版本
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并没有被排序
使用Cast转换类型和默认排序,即:CAST(unit AS UNSIGNED),unit
sql
SELECT * FROM table_name WHERE rack = ‘A03‘ ORDER BY CAST(unit AS UNSIGNED), unit
成功,结果真香!
基于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语句有的,它也不能少。
关键方法annotate和Cast
应该还有更好的方法,欢迎指点。