代码之家  ›  专栏  ›  技术社区  ›  Essex

按特定顺序使用浮点值对queryset排序

  •  0
  • Essex  · 技术社区  · 6 年前

    我正在使用django,我想得到你的帮助,以便按照我的要求对queryset进行排序。我的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']>
    

    但我想处理我的queryset以便按以下顺序显示结果:

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

    版本字段是我的模型中的一个CharField(例如,我不能将此字段更新为FloatField)。 我找不到一个办法来对付Django。知道吗?

    谢谢您!

    0 回复  |  直到 6 年前
        1
  •  1
  •   schillingt    6 年前

    假设你在使用postgres,你可以利用它 string_to_array . 这个 question here 解决它的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()
    
        2
  •  0
  •   Gerry    6 年前

    你能用lambda函数吗?

    如果s是浮动字符串的列表,那么

    s、 排序(key=lambda x:float(x))

    应该按你喜欢的方式分类。

        3
  •  0
  •   RishiG    6 年前

    考虑到您正在存储版本号,您是否想过使用字典排序法?如果你用零填充来存储这些数字,你会得到你正在寻找的答案,并且使用的是你已经使用过的过滤器(例如。, ['09.08', '09.09', '09.10', '10.00'] )

        4
  •  0
  •   Essex    6 年前

    我找到了正确的语法:

    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('.'))))
    

    它给了我:

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