首先按特定行排序

时间:2019-02-26 10:50:17

标签: python django

我在django 1.11中有一个通用的ListView,我需要返回按字母顺序排序的对象,但是要更改前2个:

class LanguageListAPIView(generics.ListCreateAPIView):
  queryset = Language.objects.all().order_by("name")
  serializer_class = LanguageSerializer

具有以下语言模型:

class Language(models.Model):
    name = models.CharField(max_length=50, unique=True)

我想返回英文,法文,然后返回数据库中按名称排序的所有其他语言。

有没有办法用django ORM实现这一目标?

谢谢

2 个答案:

答案 0 :(得分:2)

也许您可以使用两个查询集并将它们组合以获得如下结果:

q1 = Language.objects.filter(Q(name='ENGLISH'|name='FRENCH'))

q2 = Language.objects.filter(~Q(name='ENGLISH'|name='FRENCH')).order_by('name')

然后以以下方式加入查询集:

queryset = list(chain(q1, q2))

django.db.models导入Q,从itertools导入链

答案 1 :(得分:1)

从Django 1.8开始,您使用Conditional Expressions

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

Language.objects.annotate(
    order=Case(
        When(name="ENGLISH", then=Value(1)),
        When(name="FRENCH", then=Value(2)),
        default=Value(3),
        output_field=IntegerField(),
    )
).order_by('order', 'name)

这将对一个名为order的字段进行注释,然后按order字段对结果进行排序,然后按name字段对结果进行排序,其中英语/法语将得到较低的{{1 }}值,以下所有语言均相同,因此仅按名称排序。