Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在Django QuerySet中指定限制和偏移量是行不通的_Python_Django_Django Models_Django Orm - Fatal编程技术网

Python 在Django QuerySet中指定限制和偏移量是行不通的

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 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的常规日志显示两个查询都有
限制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]