Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 按特定顺序(如软件版本)使用浮点值对queryset进行排序_Python_Django - Fatal编程技术网

Python 按特定顺序(如软件版本)使用浮点值对queryset进行排序

Python 按特定顺序(如软件版本)使用浮点值对queryset进行排序,python,django,Python,Django,我正在使用django,我希望得到您的帮助,以便按照我的意愿对查询集进行排序。我的queryset从模型中获取版本列表 这是我的查询集: def actual_edition(): return MyModel.objects.values_list('version', flat=True).filter(smt__isnull=False, published=True).order_by('version').first() 它给了我: <QuerySet ['10.0',

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

这是我的查询集:

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']>
# Before sort
['10.0', '10.1', '9.10', '9.8', '9.9']
# After sort
['9.8', '9.9', '9.10', '10.0', '10.1']

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

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

在我的模型中,version字段是CharField(例如,我不能将此字段更新为FloatField)。 我找不到用Django这样做的方法。有什么想法吗


谢谢大家!

可以使用lambda函数吗

如果s是浮点字符串的列表,则

s、 排序(键=λx:float(x))


应该按照您喜欢的方式进行排序。

鉴于您存储的是版本号,您是否考虑过使用字典排序?如果您使用零填充存储数字,您将使用您正在使用的确切筛选器(即,
['09.08','09.09','09.10','10.00']

我找到了正确的语法:

def actual_edition():
    x = list(MyModel.objects.values_list('version', flat=True).filter(smt__isnull=False, published=True).order_by('version'))
    x.sort(key=lambda s: list(map(int, s.split('.'))))
它给了我:

<QuerySet ['10.0', '9.10', '9.8', '9.9']>
# Before sort
['10.0', '10.1', '9.10', '9.8', '9.9']
# After sort
['9.8', '9.9', '9.10', '10.0', '10.1']

假设您正在使用postgres,您可以使用
字符串到数组
。这解决了它的SQL部分

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

from django.db.models import Func
class StringToArray(Func):
    template = "%(function)s(%(expressions)s, '.')"
    function = 'string_to_array'
那么您的查询集将如下所示:

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

你的问题是你不想让它们按浮点顺序排列,因为数字上9.10<9.9。像这样的版本号实际上是整数序列。使用mynumber.split(“.”)中的i的int(i)转换每个版本号,并比较结果。@BoarGules您能根据您的答案给出一个比较的小例子吗?我知道,但我没有选择。如果版本是9.8,我应该是9.8而不是9.08不幸的是:/