【发布时间】:2019-07-14 07:53:27
【问题描述】:
我必须对包含主机名的对象列表进行排序。
主机名采用以下格式:h1, h5, h10, h12, h12-abc, h1000, x10
如果我使用 order_by('hostname') 它将像这样订购:
h1, h10, h1000, h12, h12-abc, h5, x10
我将如何实现这样的排序:
h1, h5, h10, h12, h12-abc, h1000, x10
主机名总是以字符开头,然后是 1-4 位数字,部分是扩展名,例如“-abc”。
我想我必须使用 Substr() 来提取数字并以某种方式排序数字,'10' 不会在 '5' 之前列出。
通过搜索,我发现了一些带有 extra() 的旧示例,但 Django 文档说它将来会被弃用,并且“将此方法用作最后的手段” https://docs.djangoproject.com/en/2.1/ref/models/querysets/#extra
什么是面向未来的方法?
【问题讨论】:
-
看起来这两个答案应该对您有所帮助:stackoverflow.com/questions/5967500/… 和 stackoverflow.com/questions/4836710/…
-
@DanSwain 我认为 OP 想要使用 django orm
-
你使用什么数据库?
-
@BearBrown PostgreSQL
-
你看过db functions吗?我写下了这个想法,但我不知道它是否可行,但可能是一个起点
Hosts.objects.annotate( letter=Substr("hostname", 0, 1), extension=StrIndex(F("hostname"), Value("-")), ).annotate( numerical=Cast(Substr("hostname", 1, Coalesce("extension", Value(None))), IntegerField()), ).order_by("extensions", "numerical")
标签: django postgresql django-queryset