Python 按特定顺序(如软件版本)使用浮点值对queryset进行排序
我正在使用django,我希望得到您的帮助,以便按照我的意愿对查询集进行排序。我的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',
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不幸的是:/