首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >编号Django,按姓名订购

编号Django,按姓名订购
EN

Stack Overflow用户
提问于 2020-06-25 11:11:56
回答 1查看 130关注 0票数 0

我在sqlite中有大约500个设备对象,其中有一个name字段,如:

代码语言:javascript
复制
Device-0
Device-1
Device-2
Device-3
...
...
Device-500

当用django列出它们时,我希望它根据名称中分号后面的数字列出,如上面所示。

我试过:

代码语言:javascript
复制
queryset = Device.objects.all().order_by('name')

也来自于这个问题

代码语言:javascript
复制
queryset = Device.objects.annotate(int_sort=Cast("name", IntegerField())).order_by("int_sort", "name")

这两种情况都产生了这样的结果:

代码语言:javascript
复制
Device-0
Device-1
Device-10
Device-100
Device-101
...

任何帮助都将不胜感激。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-06-25 11:17:03

你在找“自然排序”(字典排序)顺序

这不是内置到SQLite的(也不是我知道的任何其他数据库)。

如果所有行都遵循XYZ-123格式,则可以

  • 添加带有表达式的.extra() where=列,该表达式将列拆分为破折号,然后将第二部分转换为数字。
  • 然后再加上一个列。

示例

下面是一个可以在SQLite shell中运行的示例:

代码语言:javascript
复制
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应用程序)能够做到

代码语言:javascript
复制
Device.objects.all().extra(
  select={'device_number': "cast(substr(name,instr(name, '-')+1) as number)"},
  order_by='device_number',
)
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62573990

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档