Python django Queryset在for循环之后成为列表

Python django Queryset在for循环之后成为列表,python,django,Python,Django,我的网站使用django,这个问题很难说,请看下面的代码。(python 2.7.10) 显然,user和user1是QuerySet,现在问题来了: In [1]: user = User.objects.filter(pk__gt = 1) In [2]: type(user) Out[2]: django.db.models.query.QuerySet In [3]: for i in user:pass In [4]: user1=user[0:user.count()] In [5

我的网站使用django,这个问题很难说,请看下面的代码。(python 2.7.10)

显然,user和user1是QuerySet,现在问题来了:

In [1]: user = User.objects.filter(pk__gt = 1)
In [2]: type(user)
Out[2]: django.db.models.query.QuerySet

In [3]: for i in user:pass
In [4]: user1=user[0:user.count()]
In [5]: type(user1)
Out[5]: list
用户也是QuerySet,但user1变成了list

这两个代码之间的唯一区别是for循环

 for i in user:pass

我对for循环中发生了什么感到困惑?

通过运行
for
循环,您可以执行Django称之为评估
查询集的操作。在此之前,据说它是懒惰的,这意味着添加过滤器和其他
QuerySet
方法实际上不会影响数据库

下面是一个有趣的片段(另请参见此处的示例):

QuerySet是懒惰的–创建QuerySet的行为不涉及 任何数据库活动。你可以整天把过滤器叠在一起, Django在QuerySet完成之前不会实际运行查询 评估

有一些语句和方法用于评估
QuerySet
,这些语句和方法在中有文档记录,包括迭代和切片已评估的
QuerySet

这意味着,一旦评估了一个查询集,例如,通过对
for
循环进行迭代,Django将实际查询数据库。完成后,文档中的这一段总结了在[4]
第二个shell代码段中使用
user1=user[0:user.count()]
查询集进行切片后的行为

切片。如限制查询集中所述,可以对查询集进行切片, 使用Python的数组切片语法。切片未计算的查询集 通常返回另一个未赋值的查询集,但Django将执行 数据库查询如果使用slice语法的“step”参数, 并将返回一个列表对已评估的查询集进行切片 还将返回一个列表。


我在这里没有这种行为,我看不出for循环如何将iterable的名称重新绑定到另一个对象。for循环可能触发queryset的求值。Q是lazyI在manage.py shell中输入这些代码,这有什么关系吗?@Pynchia:Queryset的求值不会将其变成一个列表,也不会在本地范围内重新绑定名称。@KongDeqiang我当然在django shell中尝试了相同的代码模式(当然是我当前项目的模型,但它们没有什么特别的、普通的django模型)。请重新启动一个新的django shell,然后再试一次,我怀疑您有输入错误或其他问题。或者它可能是IPython走了出去,在你背后做了一些愚蠢的事情,所以请在没有IPython的情况下重试相同的代码。非常感谢,现在我知道发生了什么了!我应该有RTFM
 for i in user:pass