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

ada*_*ith 12 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])
Run Code Online (Sandbox Code Playgroud)

MySQL的一般日志显示两个查询都有LIMIT 21.

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

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

akx*_*xlr 21

当您从shell进行查询时会发生这种情况 - LIMIT添加了该子句以在调试时停止终端填充数千条记录:

您正在打印(或至少尝试打印)查询集的repr().为了避免人们不小心尝试检索和打印一百万个结果,我们(好吧,我)将其更改为仅检索并打印前20个结果并打印"余数被截断"(如果有更多).这是通过将查询限制为21个结果来实现的(如果有21个结果超过20个,那么我们打印"截断"消息).这只发生在 repr()中 - 即它仅用于诊断打印.没有普通用户代码自动包含此限制,因此您很乐意创建一个迭代超过一百万个结果的查询集.

(来源)


arg*_*rgo 9

Django OFFSET使用Python的数组切片语法实现。如果要偏移前10个元素,然后显示后5个元素,请使用它

MyModel.objects.all()[OFFSET:OFFSET+LIMIT]
Run Code Online (Sandbox Code Playgroud)

例如,如果您想在偏移量为10之后检查5位作者,那么您的代码将如下所示:

Author.objects.all()[10:15]
Run Code Online (Sandbox Code Playgroud)

您可以在Django官方文档中了解更多信息


Sha*_*aba 6

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

例如。

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

Author.objects.all()[10:10]
Run Code Online (Sandbox Code Playgroud)

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

Author.objects.all()[10:10+10]
Run Code Online (Sandbox Code Playgroud)

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