我怎样才能在Django用charfield订购一个查询集?

2024-06-25 23:14:44 发布

您现在位置:Python中文网/ 问答频道 /正文

我想订一个查菲尔德的查询集,里面有数字。 我有这个代码:

MyTable.objects.all().order_by('my_char_field')

有一些“my_char_field”的例子:

^{pr2}$

具有上述代码的订单的结果是:

"ver10", "ver3", "ver4", "x5.1 (1)", "x5.1 (2)"

但我想要的是:

"ver3", "ver4", "ver10", "x5.1 (1)", "x5.1 (2)"

我怎样才能得到自然秩序?在


Tags: 代码fieldbyobjectsmymytableorder数字
3条回答

虽然可以在客户端获取并进行排序,但也可以在服务器端使用Substr函数来完成这项工作。在

from django.db.models.functions import Substr

MyTable.objects.all().order_by(Substr('my_char_field',3))

更新:

我正在做另一个更新的答案,当问题再次更新!!以下内容还不完整,但您可以在此基础上进行构建。在

^{pr2}$

您还需要使用Cast函数将sort_字段强制转换为int。这将是一个很长的查询!!在

这更像是一个数据存储问题。如果你改变你的数据结构,它变得更加容易

version_type = models.CharField()
version_num = models.FloatField()
version_revision = models.SmallIntegerField(null=True)

unique_together = [('version_type', 'version_num', 'version_revision')]

.order_by('version_type', 'version_num', 'version_revision')

这也将解决您的下一个问题“如何有效地获取所有版本的'ver'类型?”在

我有一个CharField和一个name字段,例如,它有混合(int+string)值。”a1,“f65”,“P”,“55”e.t.c。。在

通过使用sql cast(用postgres&mysql测试)解决了这个问题, 首先,我尝试按casted整数值排序,然后按name字段的原始值排序。在

parking_slots = ParkingSlot.objects.all().extra(
        select={'num_from_name': 'CAST(name AS INTEGER)'}
    ).order_by('num_from_name', 'name')

这样,不管怎样,正确的排序对我来说都是有效的。在

相关问题 更多 >