我需要对一个包含主机名的对象列表进行排序。
这些主机名的格式有: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 有什么未来可靠的方法可以做到这一点?
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")
- mfrackowiak