查询集排序由数据库后端处理,而不是由 Django。这限制了更改排序方式的选项。您可以加载所有数据并使用 Python 对其进行排序,也可以向查询添加其他选项,以使数据库通过定义函数来使用某种自定义排序。
使用 queryset 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()
调用中仅指定一个字段。