Django 是否在每次迭代时查询数据库?

Does Django query the database on every iteration?

在 Django 中,如果我写:

for i in User.objects.all():
    i.active()

我知道我可以将变量设置为 User.objects.all() 的当前状态,然后运行循环,但我想知道 python 到底在做什么。 Python 是否只获取一次用户列表然后遍历该列表?或者它会在每次迭代时查询数据库吗?

当您使用 .all() 查询数据库时,您查询了一次并创建了一个 QuerySet 对象。然后你可以用它做任何你想做的事 QuerySet 有关更多信息,请参阅 here and here.

来自the documentation

for_stmt ::=  "for" target_list "in" expression_list ":" suite
              ["else" ":" suite]

The expression list is evaluated once

这部分与Django 没有任何关系。在像 for x in blah 这样的语句中,blah 只在循环开始时计算一次。 (理论上,对象可能会在每次迭代中对其他昂贵的东西执行操作,但正如 aus_lacy 的答案中的引用所示,Django 不会这样做。)