django查询获取最后n条记录
假设我正在实现一个消息流,记录按ID升序排序,每个获取请求,我只允许获取最新的10条记录 我试过:django查询获取最后n条记录,django,Django,假设我正在实现一个消息流,记录按ID升序排序,每个获取请求,我只允许获取最新的10条记录 我试过: Messages.objects.filter(since=since)[:-10] 我有一个错误,说不支持负索引 我当前的解决方法是按排序ID降序,然后运行: Messages.objects.filter(since=since)[:10] 但这需要前端再次颠倒顺序 我的问题是,有没有一种优雅的方法可以做到这一点?您可以将查询集传递给: 或者使用[::-1]而不是反向: last_ten
Messages.objects.filter(since=since)[:-10]
我有一个错误,说不支持负索引
我当前的解决方法是按排序ID降序,然后运行:
Messages.objects.filter(since=since)[:10]
但这需要前端再次颠倒顺序
我的问题是,有没有一种优雅的方法可以做到这一点?您可以将查询集传递给:
或者使用
[::-1]
而不是反向
:
last_ten = Messages.objects.filter(since=since).order_by('-id')[:10][::-1]
@罗恩(ron_g):
上面的解决方案使用列表理解两次(首先切片为10,然后反向)。你可以一次操作,速度快9倍
如果您希望最后X条记录按id降序排序,那么我认为您不需要自筛选 使用-id将按降序排序。
希望这是有帮助的 与公认答案相比,此查询的效率如何?Thank.filter使用
where
子句,而上面的查询是一个带有order by
clauseI的简单选择。我认为不支持负索引吗?在[:10]
slicinggif主键为UUID后,它会变成一个常规列表,不再是Django查询集,因为order_by('-id)将ID按字母顺序排序,UUID总是随机的。+1,这对我很有帮助。然而,您的解决方案使用列表理解两次(首先将其切片为10,然后反向)。您可以将其作为一个操作来完成-last\u ten=Messages.objects.filter(因为=因为)。order\u by('-id')[:10:-1]
。我使用标准列表计时,速度快了9倍。
last_ten = Messages.objects.filter(since=since).order_by('-id')[:10][::-1]
last_ten = Messages.objects.filter(since=since).order_by('-id')[:10:-1]
last_ten = Messages.objects.all().order_by('-id')[:10]