我想通过一个包含数字的字段来命令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)"
如何获得自然顺序?
答案 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