【问题标题】:Django - How does order_by work?Django - order_by 如何工作?
【发布时间】:2012-09-28 08:33:32
【问题描述】:

如果给定的order_by 字段的值对于一组记录是相同的,我想知道Django 的order_by 是如何工作的。考虑我在 DB 中有一个 score 字段,我正在使用 order_by('score') 过滤查询集。具有相同 score 值的记录将如何排列自己?

每次,它们都会在具有相同分数的记录子集中随机排序,这会破坏客户端的分页。有没有办法覆盖它并以一致的顺序返回记录?

我正在使用 Django 1.4 和 PostgreSQL。

【问题讨论】:

    标签: python django postgresql sql-order-by


    【解决方案1】:

    如果我理解正确,我认为您每次都需要一致排序的结果集,您可以使用类似order_by('score','id') 的东西,它首先按分数排序,然后按score 内的自动增量id具有相同的值,因此您的输出是一致的。文档是here。如果您想每次都获取正确的结果集,则需要在 order_by 中明确,使用“id”是其中一种方法。

    【讨论】:

      【解决方案2】:

      正如其他答案正确解释的那样,order_by() 接受多个参数。我建议使用类似的东西:

      qs.order_by('score','pk') #where qs is your queryset
      

      我建议在这些情况下使用'pk'(或'-pk')作为最后一个参数,因为每个模型都有一个pk 字段,并且它的值对于两条记录永远不会相同。

      【讨论】:

      • -1 这个答案已经给出了2次,不需要第三次,你可以编辑他们的帖子来清理编码部分
      • 这两个答案都不能完全满足 OP 的需求。 order_by('id', 'score') 将首先按“id”排序,然后按“分数”排序,这不是他需要的。 order_by('score', '-create_time') 不准确,因为它使用了未知列。使用通用的pk 提到的答案都没有。
      • 点了,但又是对他们帖子的小评论,不需要大量重复的anwser
      【解决方案3】:

      order_by 可以有多个参数,我认为order_by('score', '-create_time') 将始终返回相同的查询集。

      【讨论】:

        猜你喜欢
        • 2013-02-21
        • 1970-01-01
        • 2019-12-02
        • 1970-01-01
        • 1970-01-01
        • 2016-08-07
        • 1970-01-01
        • 1970-01-01
        • 2017-10-31
        相关资源
        最近更新 更多