django查询获取最后n条记录

Jam*_*Lin 60 django

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

我试过了:

Messages.objects.filter(since=since)[:-10]
Run Code Online (Sandbox Code Playgroud)

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

我当前的解决方法是排序ID降序,然后运行:

Messages.objects.filter(since=since)[:10]
Run Code Online (Sandbox Code Playgroud)

但这需要前端再次颠倒订单.

我的问题是,有一种优雅的方式吗?

Rob*_*jic 74

您可以将您的查询集传递给反向:

last_ten = Messages.objects.filter(since=since).order_by('-id')[:10]
last_ten_in_ascending_order = reversed(last_ten)
Run Code Online (Sandbox Code Playgroud)

  • 不检索然后建立索引是否会导致速度变慢? (2认同)

Omi*_*aha 37

或者使用[::-1]而不是reversed:

last_ten = Messages.objects.filter(since=since).order_by('-id')[:10][::-1]
Run Code Online (Sandbox Code Playgroud)

  • +1,这对我有帮助。但是,您的解决方案使用列表理解两次(首先切片到 10,然后反转)。您可以将其作为一项操作来完成 - `last_ten = Messages.objects.filter(since=since).order_by('-id')[:10:-1]`。我使用标准列表对其进行计时,速度快了 9 倍。 (12认同)
  • 我不认为支持负面索引? (2认同)
  • 在[:: 10]切片之后,它成为常规列表,不再是Django查询集。 (2认同)

all*_*yed 21

如果你想要按ID降序排序的最后X条记录,那么我认为你不需要过滤器

last_ten = Messages.objects.all().order_by('-id')[:10]
Run Code Online (Sandbox Code Playgroud)

使用-id将按降序排序.希望这有用!!

  • 与已接受的答案相比,此查询的效率如何?谢谢. (3认同)