gpt4 book ai didi

Django - order_by() 字符和数字

转载 作者:行者123 更新时间:2023-11-29 12:30:24 25 4
gpt4 key购买 nike

我必须对包含主机名的对象列表进行排序。

主机名采用以下格式: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

什么是面向 future 的方法?

最佳答案

您可以使用 f-expressions

from django.db.models import F, Value, TextField, IntegerField
from django.contrib.postgres.fields import ArrayField
from django.db.models.expressions import Func

sql = ordModel.objects.annotate(
num=Cast(
Func(
F('hostname'),
Value("\d+"),
function='regexp_matches',
),
output_field=ArrayField(IntegerField())
),
char=Func(
F('hostname'),
Value("\D+"),
function='regexp_matches',
output_field=ArrayField(TextField())
)
).order_by('char', 'num', ).values('hostname')

我对相同值列表的结果是:

<QuerySet [
{'hostname': 'h1'},
{'hostname': 'h5'},
{'hostname': 'h10'},
{'hostname': 'h12'},
{'hostname': 'h12-abc'},
{'hostname': 'h1000'},
{'hostname': 'x10'}]>

关于数据库功能你可以看L regexp_match

关于Django - order_by() 字符和数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54789490/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com