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",然后是"#FFCCC"…(

您可以使用条件表达式[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')

最新更新