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

时间:2015-07-18 21:05:17

标签: django python-3.x

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

latest_chats_list = Chat.objects.order_by('timestamp')

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

latest_chats_list = Chat.objects.order_by('timestamp')[-10:]

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

latest_chats_list = Chat.objects.order_by('-timestamp')[:10]

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

latest_chats_list = Chat.objects.order_by('-timestamp')[:10].reverse()

1 个答案:

答案 0 :(得分:7)

last_ten = Chat.objects.all().order_by('-id')[:10]
last_ten_in_ascending_order = reversed(last_ten)

编辑(来自评论)

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

因为它与SQL查询混淆,queryset.order_by()也是如此。切片查询集([:10])也会改变SQL查询,向其添加LIMITOFFSET。这两者可以以不明显的预期方式结合......

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