首页 > 解决方案 > 按特定顺序对带有浮点值的查询集进行排序(如软件版本)

问题描述

我正在使用 django,我想得到你的帮助,以便按照我的意愿对我的查询集进行排序。我的查询集从模型中获取版本列表。

这是我的查询集:

def actual_edition():
    return MyModel.objects.values_list('version', flat=True).filter(smt__isnull=False, published=True).order_by('version').first()

它给了我:

<QuerySet ['10.0', '9.10', '9.8', '9.9']>

但我想处理我的查询集,以便按以下顺序显示结果:

<QuerySet ['9.8', '9.9', '9.10', '10.0']>

version 字段是我模型中的 CharField(例如,我无法将其更新为 FloatField)。我找不到用 Django 做到这一点的方法。任何想法 ?

谢谢 !

标签: pythondjango

解决方案


假设您使用的是 postgres,您可以使用string_to_array. 这个问题在这里解决了它的SQL部分。

对于 Django,您需要一个自定义Func

from django.db.models import Func
class StringToArray(Func):
    template = "%(function)s(%(expressions)s, '.')"
    function = 'string_to_array'

然后你的 QuerySet 看起来像:

MyModel.objects.filter(
    smt__isnull=False,
    published=True,
).annotate(
    version_array=StringToArray('version'),
).order_by('version_array').values_list('version', flat=True).first()

推荐阅读