【问题标题】:django query get last n recordsdjango查询获取最后n条记录
【发布时间】:2013-12-31 13:59:00
【问题描述】:

假设我正在实现一个消息流,记录按 ID 升序排序,每个获取请求,我只想允许获取最新的 10 条记录。

我试过了:

Messages.objects.filter(since=since)[:-10]

我有一个错误说不支持负索引。

我目前的工作是对 ID 进行降序排序,然后运行:

Messages.objects.filter(since=since)[:10]

但是这需要前端再次反转顺序。

我的问题是,有没有一种优雅的方法来做到这一点?

【问题讨论】:

    标签: django


    【解决方案1】:

    您可以将您的查询集传递给reversed

    last_ten = Messages.objects.filter(since=since).order_by('-id')[:10]
    last_ten_in_ascending_order = reversed(last_ten)
    

    【讨论】:

      【解决方案2】:

      或者用[::-1]代替reversed

      last_ten = Messages.objects.filter(since=since).order_by('-id')[:10][::-1]
      

      @ron_g:

      上述解决方案使用列表理解两次(首先切片为 10,然后反转)。一次操作即可完成,速度提高了 9 倍。

      last_ten = Messages.objects.filter(since=since).order_by('-id')[:10:-1]
      

      【讨论】:

      • 我认为不支持负索引?
      • [:10] slicing 之后,它变成了一个常规列表,不再是一个 Django 查询集
      • 如果您的主键是 UUID,这将不起作用,因为 order_by('-id) 会按字母顺序对 ID 进行排序,而 UUID 始终是随机的。
      • +1,这对我有帮助。但是,您的解决方案使用列表理解两次(首先切片为 10,然后反转)。您可以将其作为一项操作来完成 - last_ten = Messages.objects.filter(since=since).order_by('-id')[:10:-1]。我使用标准列表对其进行计时,速度提高了 9 倍。
      【解决方案3】:

      如果您希望最后 X 条记录按 id 降序排序,那么我认为您不需要 since 过滤器

      last_ten = Messages.objects.all().order_by('-id')[:10]
      

      使用 -id 将按降序排序。 希望这有帮助!

      【讨论】:

      • 与接受的答案相比,此查询的效率如何?谢谢。
      • 过滤器使用where子句,而上面的查询是带有order by子句的普通选择
      【解决方案4】:

      我想检索最后25条消息并通过以下方式解决了这个问题

      #models.py
      
      class Meta:
              ordering = ['created']
      
      #views.py
      
      message1 = []
          for message in pm_messages.objects.filter(room=room_name).reverse()[0:25]:
              message1.append(message)
          messagess = message1.reverse()
      

      【讨论】:

        【解决方案5】:

        针对ron_gOmid Raha的回复中的评论:

        考虑列表中记录少于 10 条的情况:

        注意这种方法

        list[:10:-1]
        

        将返回一个空列表,而不是

        list[:10][::-1]
        

        如果总记录少于 10 条,则返回列表中的所有记录。

        【讨论】:

          猜你喜欢
          • 2021-12-24
          • 1970-01-01
          • 2022-12-07
          • 1970-01-01
          • 2011-01-12
          • 1970-01-01
          • 1970-01-01
          • 2015-04-29
          • 1970-01-01
          相关资源
          最近更新 更多