我正在使用 Django 框架编写一个网站。 我有一个模型,以“x.y.z”(或“x”、“x.y”)格式存储软件及其版本号,其中 x、y 和 z 是整数。如何将查询结果按版本号升序排序?
默认排序行为基于字符串字母顺序,但不是我想要的。
谢谢!
SPLIT_PART
函数,但 Django 目前不支持它。幸运的是,您可以编写自己的数据库函数,例如:
from django.db.models import Func
class SplitPart(Func):
function = 'SPLIT_PART'
template = "SPLIT_PART(%(expressions)s, '%(delimiter)s', %(pos)s)"
然后,你可以这样做:
from functools import partial
from django.db.models import IntegerField
from django.db.models.functions import Cast
sorted_objects = MyModel.objects.all().annotate(
v1=Cast(partial(SplitPart, delimiter=".", pos=1)("version"), output_field=IntegerField()),
v2=Cast(partial(SplitPart, delimiter=".", pos=2)("version"), output_field=IntegerField()),
v3=Cast(partial(SplitPart, delimiter=".", pos=3)("version"), output_field=IntegerField()),
).order_by("v1", "v2", "v3")
这会使用
version
作为分隔符拆分 "."
列的值,将每个部分划分为 Cast
,然后按这些部分对查询集进行排序。