如何在字符串字段上对 django 查询结果进行排序,包括软件版本 x.y.z

问题描述 投票:0回答:1

我正在使用 Django 框架编写一个网站。 我有一个模型,以“x.y.z”(或“x”、“x.y”)格式存储软件及其版本号,其中 x、y 和 z 是整数。如何将查询结果按版本号升序排序?

默认排序行为基于字符串字母顺序,但不是我想要的。

谢谢!

django sorting
1个回答
0
投票

PostgreSQL 有一个

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
,然后按这些部分对查询集进行排序。
    

© www.soinside.com 2019 - 2024. All rights reserved.