我使用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的常规日志显示两个查询都有LIMIT 21
。
但是小于21的限制可以起作用,例如len(Author.objects.all()[0:10])
会生成一个LIMIT 10
的SQL。
为什么?我需要配置什么吗?
答案 0 :(得分:19)
当您从shell进行查询时会发生这种情况 - 添加LIMIT
子句以阻止终端在调试时填满数千条记录:
你正在打印(或者,至少,试图打印)的repr() 查询集。避免人们不小心试图检索和打印 百万个结果,我们(好吧,我)将其改为仅检索和打印 前20个结果和打印"剩余截断"如果有更多。 这是通过将查询限制为21个结果(如果有21个)来实现的 结果有超过20个,所以我们打印"截断"信息)。 这只发生在 repr ()中 - 即它仅用于诊断 打印。没有普通用户代码自动包含此限制,因此 您很乐意创建一个迭代超过一百万个结果的查询集。
(Source)
答案 1 :(得分:2)
Django使用Python的数组切片语法实现OFFSET
。如果要先偏移前10个元素,然后显示后5个元素,请使用
MyModel.objects.all()[OFFSET:OFFSET+LIMIT]
例如,如果您想在偏移10之后检查5位作者,那么您的代码将如下所示:
Author.objects.all()[10:15]
答案 2 :(得分:1)
我确实工作,但是django使用了迭代器。它不会一次加载所有对象。
答案 3 :(得分:1)
我使用和工作的偏移和限制:)
MyModel.objects.all()[offset:limit]
for exapmle: -
Post.objects.filter(Post_type=typeId)[1:1]
答案 4 :(得分:1)
LIMIT
和OFFSET
在Django中的工作方式与我们期望的不同。
例如。
如果我们必须从第10行开始读取下10行,并且我们指定了:
Author.objects.all()[10:10]
它将返回空的记录列表。为了获取接下来的10行,我们必须将偏移量添加到限制中。
Author.objects.all()[10:10+10]
它将返回从第10行开始的下10行的记录列表。