如何获取django查询的最后n个对象?

use*_*064 4 django python-3.x

我正在尝试在django中显示聊天记录.我可以使用此查询以正确的顺序获取整个聊天记录.

latest_chats_list = Chat.objects.order_by('timestamp')
Run Code Online (Sandbox Code Playgroud)

我想要这行的功能(按顺序排列最后10个元素),但django不允许负索引.

latest_chats_list = Chat.objects.order_by('timestamp')[-10:]
Run Code Online (Sandbox Code Playgroud)

如果我尝试这一行,我会收到我想要的消息,但它们的顺序错误.

latest_chats_list = Chat.objects.order_by('-timestamp')[:10]
Run Code Online (Sandbox Code Playgroud)

这一行给出了前10个聊天而不是最近的聊天.

latest_chats_list = Chat.objects.order_by('-timestamp')[:10].reverse()
Run Code Online (Sandbox Code Playgroud)

Aja*_*pta 7

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

编辑(来自评论)

为什么不使用Django queryset.reverse()

因为它与SQL查询混淆,因为它queryset.order_by().切片queryset([:10])也会改变SQL查询,添加LIMIT和查询OFFSET.这两者可以以不明显的预期方式结合......

另一方面,内置的Python函数reversed(iterable)只会改变查询集迭代的方式,而不会影响SQL.

  • 谢谢!这有效,但我有一些问题.你为什么决定用id而不是时间戳订购?为什么逆向(last_ten)和last_ten.reverse()的行为不同? (2认同)
  • 如果我的 id 是 UUID 怎么办?这个答案不是通用的。 (2认同)