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')
Вернуться на верх