我想取一个模型的最后10个实例,并有这样的代码:
Model.objects.all().order_by('-id')[:10]
是不是先选取所有实例,然后只选取最后10个实例? 有没有更有效的方法?
我想取一个模型的最后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切片中执行限制。将庞大的列表检索到应用程序内存中是没有好处的。
其他回答
过滤器问题的简单答案
Notification.objects.filter(user=request.user).order_by("-id")[:limit]
只需输入order_by然后[:limit]
切片的QuerySets返回一个列表,这意味着如果你喜欢:
>>> Model.objects.all().order_by('-id')[:10]
它将返回一个列表,问题是你不能在列表上执行进一步的QuerySet方法
所以如果你想对返回的结果做更多的事情,你可以:
>>> limit = 5 # your choice
>>>
>>> m1 = Model.objects.filter(pk__gte=Model.objects.count() - limit) # last five
>>> m2 = Model.objects.filter(pk__lte=limit) # first five
现在你可以执行更多的方法:
# Just for illustration
>>> m2.annotate(Avg("some_integer_column")) # annotate
>>> m2.annotate(Sum("some_integer_column"))
>>> m2.aggregate(Sum("some_integer_column")) # aggregate
通过使用切片符号([])来限制结果,也可以限制链接QuerySet方法的能力。
如果你非常确定你不需要做任何进一步的查询,那么切片就可以了。
Django。9 1个。
打印qs。查询并查看LIMIT
pos_random = Position.objects.filter( gps_time__gte = start_time, gps_time__lte = end_time, vehicle = v)[:**LIMIT_NUMBER**]
是的。如果你想获取有限的对象子集,你可以使用下面的代码:
例子:
obj=emp.objects.all()[0:10]
开始的0是可选的,所以
obj=emp.objects.all()[:10]
上面的代码返回前10个实例。
实际上,我认为LIMIT 10会被发布到数据库,这样切片就不会在Python中发生,而是在数据库中发生。
有关更多信息,请参阅limits -querysets。