我在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实现这一目标?
谢谢
答案 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 }}值,以下所有语言均相同,因此仅按名称排序。