我必须对包含主机名的对象列表进行排序。
主机名采用以下格式:h1, h5, h10, h12, h12-abc, h1000, x10
如果我使用 order_by('hostname') 它将像这样排序:
h1, h10, h1000, h12, h12-abc, h5, x10
Run Code Online (Sandbox Code Playgroud)
我将如何实现这样的排序:
h1, h5, h10, h12, h12-abc, h1000, x10
Run Code Online (Sandbox Code Playgroud)
主机名始终以字符开头,然后是 1-4 位数字和部分扩展名,例如“-abc”。
我想我必须使用 Substr() 来提取数字并以某种方式对数字进行排序,“10”不会列在“5”之前。
通过搜索,我发现了一些带有 extra() 的旧示例,但 Django 文档说它将在未来被弃用,并且“使用此方法作为最后的手段” https://docs.djangoproject.com/en/2.1/ref/models /查询集/#extra
面向未来的方法是什么?
Django在2个地方设置了以下查询,唯一的限制就是限制并给我不同的结果
这是以下QuerySet的第一个结果
list_empleados = empleado.objects.filter(
empresa=session_empresa
).order_by('-puntos')[:3]
Run Code Online (Sandbox Code Playgroud)

正确的结果应该是:
19,13,9而不是9,19,13看到我的意思?
这是第二个QuerySet
list_empleados = empleado.objects.filter(
empresa=session_empresa
).order_by('puntos')
Run Code Online (Sandbox Code Playgroud)
这是结果

正确的结果应该是:
19,13,9,1而不是1,13,19,9看到我的意思?
models.py
class empleado(models.Model):
empresa = models.ForeignKey(empresa)
nombre = models.CharField(max_length=50)
fecha_nacimiento = models.DateField(auto_now_add=False)
GENDER_CHOICES = (
('M', 'Masculino'),
('F', 'Femenino'),
)
sexo = models.CharField(max_length=1, choices=GENDER_CHOICES)
avatar = StdImageField(upload_to='avatar/%Y/%m/%d', variations={
'large': (300, 300, True),
'medium': (50, 50, True),
'thumbnail': (98, 122, True)})
correo = models.EmailField(max_length=100)
departamento = models.ForeignKey(departamento)
telefono = models.CharField(max_length=21)
direccion = models.CharField(max_length=200)
twitter = models.CharField(max_length=15)
usuario = models.CharField(max_length=15)
password = models.CharField(max_length=40)
primer_lugar …Run Code Online (Sandbox Code Playgroud)