我想取一个模型的最后10个实例,并有这样的代码:

 Model.objects.all().order_by('-id')[:10]

是不是先选取所有实例,然后只选取最后10个实例? 有没有更有效的方法?


当前回答

看起来问题中的解决方案不再适用于Django 1.7,并引发一个错误: “一旦片被取走,就不能重新排序查询”

根据文档https://docs.djangoproject.com/en/dev/topics/db/queries/#limiting-querysets,强制使用Python切片语法的“step”参数计算查询。它是这样工作的:

Model.objects.all().order_by('-id')[:10:1]

我仍然想知道是否在返回的整个结果数组的SQL或Python切片中执行限制。将庞大的列表检索到应用程序内存中是没有好处的。

其他回答

是的。如果你想获取有限的对象子集,你可以使用下面的代码:

例子:

obj=emp.objects.all()[0:10]

开始的0是可选的,所以

obj=emp.objects.all()[:10]

上面的代码返回前10个实例。

看起来问题中的解决方案不再适用于Django 1.7,并引发一个错误: “一旦片被取走,就不能重新排序查询”

根据文档https://docs.djangoproject.com/en/dev/topics/db/queries/#limiting-querysets,强制使用Python切片语法的“step”参数计算查询。它是这样工作的:

Model.objects.all().order_by('-id')[:10:1]

我仍然想知道是否在返回的整个结果数组的SQL或Python切片中执行限制。将庞大的列表检索到应用程序内存中是没有好处的。

过滤器问题的简单答案

Notification.objects.filter(user=request.user).order_by("-id")[:limit]

只需输入order_by然后[:limit]

作为对其他有用答案的补充和观察,值得注意的是,实际执行[:10]As切片将返回列表的前10个元素,而不是后10个元素……

为了得到最后的10,你应该做[-10:](见这里)。这将帮助您避免使用order_by('-id')和-来反转元素。

Django。9 1个。

打印qs。查询并查看LIMIT

pos_random = Position.objects.filter( gps_time__gte = start_time, gps_time__lte = end_time, vehicle = v)[:**LIMIT_NUMBER**]