如何通过带数字的字段在Django中订购QuerySet?

时间:2016-12-16 10:01:01

标签: python django django-queryset

我想通过一个包含数字的字段来命令QuerySet。 我有这段代码:

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

有一些“my_char_field”的例子:

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

上面代码的订单结果是:

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

但我想要的顺序是:

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

如何获得自然顺序?

4 个答案:

答案 0 :(得分:5)

这似乎更像是数据存储问题。如果您更改数据结构, 会变得更容易

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'类型的所有版本?”

答案 1 :(得分:3)

虽然可以在客户端获取并进行排序,但您也可以使用Substr功能在服务器端执行此操作。

Get-AzureRmSubscription –SubscriptionName "MyFavSubscription" | Select-AzureRmSubscription

更新

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

Set-AzureRmCurrentStorageAccount –ResourceGroupName "MyFavResourceGroup" `
                                 –StorageAccountName "MyFavStorageAccountName"

您还需要使用Cast函数将sort_field强制转换为int。这将是一个长期的查询!!

答案 2 :(得分:1)

我有一个带有名称字段的CharField,例如,它具有混合(int +字符串)值。 “ a1”,“ f65”,“ P”,“ 55” e.t.c ..

使用sql cast解决了该问题(已通过postgres和mysql测试), 首先,我尝试按强制转换的整数值排序,然后按名称字段的原始值排序。

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

这样,无论如何,正确的分类对我有用。

答案 3 :(得分:0)

就像@AKS提到的那样,在内存中进行排序可能效率很低。只要你有一个大表,你想只拉出排序结果的第一页。然后,您必须从数据库中提取每一行,然后才能进行排序。

<小时/> 也许你可以尝试在添加新记录时添加另一个从“排序”字段填充的字段。这一次,您可以让数据库排序为您工作。

Something From Vem3456 to Vem6543