在Django中按数字字符串排序查询结果(Postgres后端)

7 投票
1 回答
4375 浏览
提问于 2025-04-17 10:42

我有一个表格,其中有一个名字(varchar)字段,这个字段只存放数字字符串。我想按照这个字段来排序我的查询结果。但是,名字字段的排序是按字母顺序进行的,而我希望它们按数字顺序排序。

举个例子,如果我得到的名字字段值是 1、2、200 和 100,它们的排序结果是 1、100、2、200,但我希望它们的排序结果是 1、2、100、200。

我能想到以下的查询语句:

select *
from my_table as t
where t.foo='bar'
order by cast(t.name as integer);

但是我不知道怎么把这个转换成 Django 的 ORM 查询集?有没有什么办法可以做到这一点?

1 个回答

10

首先,我想问问你,为什么会有一个需要当作数字处理的varchar列,不过这不重要。

你可以使用 extra 这个查询集方法来把你的字符串转换成数字:

MyTable.objects.extra(select={'int_name': 'CAST(t.name AS INTEGER)'},
                      order_by=['int_name'])

撰写回答