Django:按多个字段排序

91
我正在以列表形式获取order_by字段。 我想使用Django ORM按多个字段排序。 列表如下所示:
orderbyList = ['check-in','check-out','location']

我正在写一个像这样的查询:
modelclassinstance.objects.all().order_by(*orderbyList)

我期望列表中的所有内容都是动态的。我没有预先定义的数据集。有人可以告诉我如何使用Django ORM来实现这个吗?
6个回答

154

尝试类似这样的东西

modelclassinstance.objects.order_by('check-in', 'check-out', 'location')

对于这个,你不需要使用.all()

你也可以在你的模型类中定义排序方式

例如:

class Meta:
       ordering = ['check-in', 'check-out', 'location']

4
谢谢,我明白了。我从其他链接中获取了它。modelclassinstance.objects.order_by(*orderbyList)的意思是按照指定的属性对模型实例进行排序。 - danny

10

在查询参数中传递订单列表

例如:yourdomain/?order=location&order=check-out

default_order = ['check-in']  #default order
order = request.GET.getlist('order', default_order)
modelclassinstance.objects.all().order_by(*orderbyList)


1

modelclassinstance.objects.filter(anyfield='value').order_by('check-in', 'check-out', 'location')

模型类实例.objects.filter(任意字段='值').order_by('入住时间', '退房时间', '位置')

1
目前你的回答不够清晰。请编辑并添加更多细节,以帮助其他人理解它如何回答所提出的问题。你可以在帮助中心找到有关如何撰写好答案的更多信息。 - Community

0

您应该将数据库表列的字符串化参数列表(由ORM在相应的models.py文件中指定)传递给返回查询集上的.order_by()方法,如下所示:shifts = Shift.objects.order_by('start_time', 'employee_first_name')。通过记号.order_by(**args),您可以记住它接受任意数量的参数。


-3

试试这个:

listOfInstance = modelclassinstance.objects.all()

for askedOrder in orderbyList:
    listOfInstance = listOfInstance.order_by(askedOrder)

1
modelclassinstance.objects.order_by(*orderbyList) 是更好的 order_by 排序方式。 - Max L
17
根据 Django 文档(https://docs.djangoproject.com/en/2.0/ref/models/querysets/#order-by),这种方式无法达到预期的结果--“每次 order_by() 调用都会清除先前的排序。” - Erwin Julius
这是毫无意义的,因为实例列表从未被保存。 - Trect

-5
你需要做的是链接查询集,换句话说:
classExample.objects.all().order_by(field1).order_by(field2)...

7
不要那样做。每次调用 order_by() 都会清除之前的排序设置。比如说,这个查询将按照 field2 而不是 field1 进行排序! - Hashem Zargari

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接