在Django QuerySet中指定限制和偏移量不起作用

时间:2014-06-04 15:23:13

标签: 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的常规日志显示两个查询都有LIMIT 21

但是小于21的限制可以起作用,例如len(Author.objects.all()[0:10])会生成一个LIMIT 10的SQL。

为什么?我需要配置什么吗?

5 个答案:

答案 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]

您可以详细了解here in the official Django doc

答案 2 :(得分:1)

我确实工作,但是django使用了迭代器。它不会一次加载所有对象。

答案 3 :(得分:1)

我使用和工作的偏移和限制:)

MyModel.objects.all()[offset:limit]

for exapmle: -

Post.objects.filter(Post_type=typeId)[1:1]

答案 4 :(得分:1)

LIMITOFFSET在Django中的工作方式与我们期望的不同。

例如。

如果我们必须从第10行开始读取下10行,并且我们指定了:

Author.objects.all()[10:10]

它将返回空的记录列表。为了获取接下来的10行,我们必须将偏移量添加到限制中。

Author.objects.all()[10:10+10]

它将返回从第10行开始的下10行的记录列表。