queryset的顺序是由数据库后端处理,而不是由Django的。这限制了改变订购方式的选项。您可以加载所有数据并使用Python对其进行排序,也可以向查询添加其他选项以使数据库通过定义函数来使用某种自定义排序。
使用查询集extra()功能将允许你通过执行自定义SQL进行排序,做你想做的,但在降低便携性为代价的。
在您的例子,它很可能足以输入字段分成两组数据,初始字符,并且剩余的整数值。然后,您可以对这两列应用排序。下面是一个例子(未经测试):
qs = MyModel.objects.all()
# Add in a couple of extra SELECT columns, pulling apart this_field into
# this_field_a (the character portion) and this_field_b (the integer portion).
qs = qs.extra(select={
'this_field_a': "SUBSTR(this_field, 1)",
'this_field_b': "CAST(substr(this_field, 2) AS UNSIGNED)"})
的extra
呼叫添加了两个新领域进入SELECT
通话。第一个子句取出该字段的第一个字符,第二个子句将该字段的其余部分转换为整数。
现在应该可以order_by
在这些领域。通过指定两个字段为order_by
,顺序先应用于字符字段,然后应用于整数字段。
如
qs = qs.order_by('this_field_a', 'this_field_b')
这个例子应该在MySQL和SQLite的工作。还应该可以创建一个仅用于排序的额外字段,允许您在order_by()
调用中只指定一个字段。
完美的工作。尽管我不知道你是否编辑了你的答案在某处添加了一个额外的封闭支架......我不得不添加一个。尽管如此,像一个魅力工作!谢谢 :) – Garfonzo 2013-03-18 01:32:19