Django queryset order_by определить порядок следования
У меня есть эта модель :
class Project(models.Model):
COLORS = (
('#FFFF00', "new project to analyse"),
('#FFFCCC', "to analyse"),
('#FFAFFF', "analysis in progress"),
('#FFFFFF', "project validated"),
('#008800', "project validated today"),
('#66B2FF', "project not validated"),
('#004DDD', "project not validated and deleted"),
)
name = models.CharField(max_length=200, verbose_name="Project name", default="")
color = models.CharField(max_length=7, choices=COLORS, null=True, blank=True)
и я хочу получить набор запросов со всеми проектами, отсортированными по цвету. Поэтому я сделал следующее :
projects = Project.objects.order_by('color')
Моя проблема в том, что цвета сортируются в алфавитном порядке, но я хочу, чтобы они сортировались в порядке 'COLORS' (сначала '#FFFF00', затем '#FFFCCC' ...)
Вы можете работать с выражением условия [Django-doc]:
from django.db.models import Case, IntegerField, Value, When
Project.objects.alias(
color_order=Case(
*[When(color=color, then=Value(i)) for i, color in enumerate(COLORS)],
output_field=IntegerField()
)
).order_by('color_order')