Django: 使用 order_by 对数值进行排序

31

我面临这样的情况:必须通过一个用于存储街道地址的CharField输出一份非常大的对象列表。

我的问题是,由于它是一个Charfield,显然数据按ASCII码排序,结果可预测。比如,数字会像这样排序;

1, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 2, 20, 21....

显然,下一步应该将CharField更改为正确的字段类型(比如IntegerField),但由于一些地址可能有公寓号,例如“128A”,因此这种方法无法起作用。

我真的不知道该如何正确排序这个问题……


想知道你是否找到了解决方案。非常感谢。 - Nathan Keller
这个解决方案在我的电脑上运行良好:https://dev59.com/hLHma4cB1Zd3GeqPT_6Z#54797177 - cem
11个回答

0
我有一个类似的情况。一个旧的数据库中有一个表,其中一个列(名为page)的数据大多是数字,类型为varchar。我需要按照自然数的顺序对查询结果进行排序,但是我不需要在结果中改变数据类型。最终,我将列的值转换为数字,仅用于排序。
(ItemPage.objects.filter(volume__id=volumeId)
.order_by('item__topic__name', F('page') * 1, 'item__name'))

我看到这里有一些其他答案表明MySQL的CAST()可能无法处理包含数字和字母混合的字符串,但是通过实验,我不认为这是真的。也许这是一个旧版本MySQL的问题。
无论是不是问题,我决定改为将值乘以1。这对我来说效果很好。在某个时候,我会尝试使用CAST(),看它是否总是有效,并且是否比乘以1执行得更快。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接