Python 在Django QuerySet中指定限制和偏移量是行不通的
我使用的是Django 1.6.5,并登录了MySQL的通用查询日志,因此我可以看到sql正在访问MySQL。Python 在Django QuerySet中指定限制和偏移量是行不通的,python,django,django-models,django-orm,Python,Django,Django Models,Django Orm,我使用的是Django 1.6.5,并登录了MySQL的通用查询日志,因此我可以看到sql正在访问MySQL。 我注意到在Django的QuerySet中指定更大的限制是行不通的: >>> from blog.models import Author >>> len(Author.objects.filter(pk__gt=0)[0:999]) >>> len(Author.objects.all()[0:999]) MySQL的常规日
我注意到在Django的QuerySet中指定更大的限制是行不通的:
>>> from blog.models import Author
>>> len(Author.objects.filter(pk__gt=0)[0:999])
>>> len(Author.objects.all()[0:999])
MySQL的常规日志显示两个查询都有限制21
但是小于21的限制是可行的,例如len(Author.objects.all()[0:10])
将生成具有limit 10
的sql
为什么呢?有什么我需要配置的吗?当您从shell进行查询时会发生这种情况-添加了
LIMIT
子句,以阻止您的终端在调试时填充数千条记录:
您正在打印(或至少尝试打印)的repr()
queryset。避免人们意外地试图检索和打印
一百万个结果,我们(好吧,我)将其更改为仅检索和打印
前20个结果,如果有更多结果,则打印“剩余部分截断”。
这是通过将查询限制为21个结果(如果有21个)来实现的
结果有20多个,因此我们打印“截断”消息)。
这只发生在repr()——也就是说,它只用于诊断
印刷。没有正常的用户代码自动包含此限制,因此
您可以愉快地创建一个查询集,该查询集可以迭代一百万个结果
()我确实可以工作,但django使用迭代器。它不会一次加载所有对象。对于我使用和为我工作的偏移量和限制:) 例如:-
Post.objects.filter(Post_type=typeId)[1:1]
Django使用Python的数组切片语法实现
OFFSET
。如果要偏移前10个元素,然后显示下5个元素,请使用它
MyModel.objects.all()[OFFSET:OFFSET+LIMIT]
例如,如果要在偏移量为10后检查5位作者,则代码如下所示:
Author.objects.all()[10:15]
你可以阅读更多关于它的内容
我也写了一篇关于这个概念的博客,在Django,
限制和偏移量的工作方式与我们预期的工作方式不同
比如说
如果我们必须从第10行开始读取接下来的10行,并且如果我们指定:
Author.objects.all()[10:10]
它将返回空记录列表。为了获取接下来的10行,我们必须将偏移量添加到限制
Author.objects.all()[10:10+10]
它将从第10行开始返回下10行的记录列表。这只意味着数据库中有21个条目,请注意,slice不会抛出错误。我从来不知道这一点。如果可以的话,我会投10票!我认为切片应该是[offset:offset+limit]
。但事实并非如此@neuron其[offset:limit]将其视为[FROM:TO],当我使用带有offset和limit的过滤器时,我得到了在'str'和'int'实例之间不支持的错误'>='
Author.objects.all()[10:10+10]