Django переставляет объекты внутри querySet по индексу

В моем приложении есть таблица "Task". В этой таблице есть поле под названием приоритет с ограниченным выбором ("Высокий", "Средний", "Низкий"). Я упорядочил их по приоритету, который имеет следующий порядок: Высокий, Низкий, Средний, когда я хотел бы, чтобы порядок был Высокий, Средний, Низкий. Как я могу поменять местами Low и Medium внутри querySet?

views.py:

tasks = Tasks.objects.values("priority").annotate(count=Count("priority"))

вывод:

<QuerySet [{'priority': 'High', 'count': 3}, {'priority': 'Low', 'count': 3}, {'priority': 'Medium', 'count': 3}]>

желаемый результат:

<QuerySet [{'priority': 'High', 'count': 3}, {'priority': 'Medium', 'count': 3}, {'priority': 'Low', 'count': 3}]>

Вы можете упорядочить по аннотации, поэтому вы можете добавить аннотацию, которая устанавливает определенное значение, используя Case и When, которые соответствующим образом переупорядочат ваш набор запросов:

from django.db.models import Case, When, Count, Value

tasks = Tasks.objects.annotate(re_order=Case(
        When(priority="High", then=Value(3)),
        When(priority="Medium", then=Value(1)),
        When(priority="Low", then=Value(2)),
        default=Value(0),
     )
).order_by('re_order').values("priority").annotate(count=Count("status"))

Вы могли бы использовать дикту и ** распаковку, чтобы сделать это более DRY.

Вернуться на верх