我在sqlite中有大约500个设备对象,其中有一个name字段,如:
Device-0
Device-1
Device-2
Device-3
...
...
Device-500当用django列出它们时,我希望它根据名称中分号后面的数字列出,如上面所示。
我试过:
queryset = Device.objects.all().order_by('name')也来自于这个问题
queryset = Device.objects.annotate(int_sort=Cast("name", IntegerField())).order_by("int_sort", "name")这两种情况都产生了这样的结果:
Device-0
Device-1
Device-10
Device-100
Device-101
...任何帮助都将不胜感激。
发布于 2020-06-25 11:17:03
你在找“自然排序”(字典排序)顺序。
这不是内置到SQLite的(也不是我知道的任何其他数据库)。
如果所有行都遵循XYZ-123格式,则可以
.extra() where=列,该表达式将列拆分为破折号,然后将第二部分转换为数字。示例
下面是一个可以在SQLite shell中运行的示例:
sqlite> create table device (name text);
sqlite> insert into device (name) values ('Device-1'),('Device-2'),('Device-3'),('Device-4'),('Device-5'),('Device-6'),('Device-7'),('Device-8'),('Device-9'),('Device-10'),('Device-11'),('Device-12'),('Device-13'),('Device-14'),('Device-15'),('Device-16'),('Device-17'),('Device-18'),('Device-19'),('Device-20'),('Device-21'),('Device-22'),('Device-23'),('Device-24'),('Device-25'),('Device-26'),('Device-27'),('Device-28'),('Device-29'),('Device-30'),('Device-31'),('Device-32'),('Device-33'),('Device-34'),('Device-35'),('Device-36'),('Device-37'),('Device-38'),('Device-39');
sqlite> select * from device order by name limit 10;
Device-1
Device-10
Device-11
Device-12
Device-13
Device-14
Device-15
Device-16
Device-17
Device-18
sqlite> select *, cast(substr(name,instr(name, '-')+1) as number) number from device order by number limit 10;
Device-1|1
Device-2|2
Device-3|3
Device-4|4
Device-5|5
Device-6|6
Device-7|7
Device-8|8
Device-9|9
Device-10|10在这个例子中,您应该(但我没有验证,因为我手上没有合适的Django应用程序)能够做到
Device.objects.all().extra(
select={'device_number': "cast(substr(name,instr(name, '-')+1) as number)"},
order_by='device_number',
)https://stackoverflow.com/questions/62573990
复制相似问题