Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
django查询获取最后n条记录_Django - Fatal编程技术网

django查询获取最后n条记录

django查询获取最后n条记录,django,Django,假设我正在实现一个消息流,记录按ID升序排序,每个获取请求,我只允许获取最新的10条记录 我试过: Messages.objects.filter(since=since)[:-10] 我有一个错误,说不支持负索引 我当前的解决方法是按排序ID降序,然后运行: Messages.objects.filter(since=since)[:10] 但这需要前端再次颠倒顺序 我的问题是,有没有一种优雅的方法可以做到这一点?您可以将查询集传递给: 或者使用[::-1]而不是反向: last_ten

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

我试过:

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]