postgresql Django - order_by 如何工作?
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/12775844/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Django - How does order_by work?
提问by Babu
I'd like to know how Django's order_by
works if the given order_by
field's values are same for a set of records. Consider I have a score
field in DB and I'm filtering the queryset using order_by('score')
. How will records having the same values for score arrange themselves?
order_by
如果order_by
一组记录的给定字段的值相同,我想知道 Django 的工作原理。考虑我score
在数据库中有一个字段,我正在使用order_by('score')
. 具有相同 score 值的记录将如何排列?
Every time, they're ordered randomly within the subset of records having equal score and this breaks the pagination at client side. Is there a way to override this and return the records in a consistent order?
每次,它们都会在具有相同分数的记录子集中随机排序,这会破坏客户端的分页。有没有办法覆盖它并以一致的顺序返回记录?
I'm Using Django 1.4 and PostgreSQL.
我正在使用 Django 1.4 和 PostgreSQL。
回答by Anuj Gupta
As the other answers correctly explain, order_by()
accepts multiple arguments. I'd suggest using something like:
正如其他答案正确解释的那样,order_by()
接受多个参数。我建议使用类似的东西:
qs.order_by('score','pk') #where qs is your queryset
I recommend using 'pk'
(or '-pk'
) as the last argument in these cases, since every model has a pk
field and its value is never the same for 2 records.
在这些情况下,我建议使用'pk'
(or '-pk'
) 作为最后一个参数,因为每个模型都有一个pk
字段,并且它的值对于 2 个记录来说永远不会相同。
回答by iMom0
order_by
can have multiple params, I think order_by('score', '-create_time')
will always return the same queryset.
order_by
可以有多个参数,我认为order_by('score', '-create_time')
将始终返回相同的查询集。
回答by bhatiaravi
If I understand correctly, I think you need consistently ordered result set every time, You can use something like order_by('score','id')
that will first order by the score first and then by the auto-increment id
within the score
having same values, hence your output being consistent. The documentation is here. You need to be explicit in the order_by if you want to fetch correct result set every time, using 'id' is one of the ways.
如果我理解正确的话,我觉得你一直需要有序的结果集,每次,你可以使用类似order_by('score','id')
的分数通过自动递增第一,那么就会一阶id
的内部score
具有相同的值,因此您的输出是一致的。文档在这里。如果您想每次都获取正确的结果集,您需要在 order_by 中明确,使用 'id' 是其中一种方法。