在 django(postgres 后端)中按数字字符串排序查询结果
Posted
技术标签:
【中文标题】在 django(postgres 后端)中按数字字符串排序查询结果【英文标题】:Ordering query result by numeric strings in django (postgres backend) 【发布时间】:2012-02-15 01:13:34 【问题描述】:我有一个表,其名称 (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】:我首先要问为什么你有一个需要被视为数字的 varchar 列,但没关系。
您可以使用extra
queryset 方法来转换您的字符串:
MyTable.objects.extra(select='int_name': 'CAST(t.name AS INTEGER)',
order_by=['int_name'])
【讨论】:
如果列中的一个或多个值不是有效整数会发生什么,它会诉诸字母顺序,不应用顺序还是失败? 它会在 PostgreSQL 上失败,但在 mysql 上会很好......我从 db 转换后才发现......如果有人知道如何规避它,那就太好了! 对此解决方案感兴趣,我们有一个包含文本和整数的列。排序时,“10”位于“1”旁边,而不是“9”下方。以上是关于在 django(postgres 后端)中按数字字符串排序查询结果的主要内容,如果未能解决你的问题,请参考以下文章
用于创建数据库、运行测试的 Django / postgres 设置
如何使用 django ORM 在 postgres 中仅选择日期部分