Django查询获取最后n条记录


70

可以说我正在实现一个消息流,按ID升序对记录进行排序,每个获取请求,我只希望获取最新的10条记录。

我试过了:

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

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

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

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

但这需要前端再次颠倒顺序。

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

Answers:


88

您可以将您的queryset传递给reversed

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

45

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

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

3
我不认为支持负索引吗?
Orangft

2
[:10]切片后,它成为常规列表,不再是Django查询集
RubberDuckRabbit

如果您的主键是UUID,这将不起作用,因为order_by('-id)会按字母顺序对ID进行排序,并且UUID始终是随机的。
卡兰·库玛

8
+1,这对我有所帮助。但是,您的解决方案使用两次列表理解(首先将其切成10,然后反转)。您可以将其作为一项操作-进行last_ten = Messages.objects.filter(since=since).order_by('-id')[:10:-1]。我使用标准列表对其进行计时,速度提高了9倍。
ron_g

24

如果您希望最后的X条记录按id降序排列,那么我认为您不需要,因为filter

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

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


3
与接受的答案相比,该查询的效率如何?谢谢。
几乎是初学者

1
filter使用where子句,而上面的查询是带order by子句的普通选择
allsyed '17
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.