我正在使用 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
,然后按这些部分对查询集进行排序。显然,您必须扩展此方法以支持 IntegerField
和
"x"
格式。