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.