Сортировать набор запросов с плавающими значениями по определенному порядку (например, версия программного обеспечения) - PullRequest
1 голос
/ 16 мая 2019

Я использую 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']>

поле версии является CharField в моей модели (я не могу обновить это, например, до FloatField).Я не нахожу способ сделать это с Джанго.Есть идеи?

Спасибо!

Ответы [ 4 ]

1 голос
/ 16 мая 2019

Если вы используете 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()
0 голосов
/ 16 мая 2019

Учитывая, что вы сохраняете номера версий, задумывались ли вы об использовании лексикографической сортировки? Если вы храните числа с нулевым заполнением, вы получите ответ, который ищете, с точным фильтром, который вы уже используете (т.е. ['09.08', '09.09', '09.10', '10.00'])

0 голосов
/ 16 мая 2019

Я нашел правильный синтаксис для этого:

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']
0 голосов
/ 16 мая 2019

Можете ли вы использовать лямбда-функцию?

Если s - список строк с плавающей точкой, то

s.sort (ключ = лямбда x: float (x))

должно сортироваться так, как вы хотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...