2015-01-05 44 views
0

在Django中,如果我寫:Django在每次迭代中查詢數據庫嗎?

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

我知道我可以一個變量設置爲User.objects.all()的當前狀態,然後運行循環,但我想知道是什麼蟒蛇真的在做。 Python只會獲得一次用戶列表,然後遍歷該列表?或者它會在每次迭代中查詢數據庫?

+2

如果您詢問User.objects .all()'只對整個循環計算一次,或者每次迭代計算一次,答案是「整個循環只有一次」。 – BrenBarn

+0

https://docs.djangoproject.com/en/1.7/ref/models/querysets/#when-querysets-are-revaluated –

+1

@BrenBarn你有什麼證據支持它嗎? – agconti

回答

2

the documentation

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

表達式列表計算一次

這部分內容沒有什麼關係的Django。在像for x in blah這樣的聲明中,blah僅在循環開始時評估一次。 (理論上,對象在每次迭代中都可能會遇到其他昂貴的東西,但正如aus_lacy的答案中的參考所示,Django不會這樣做。)

1

當您使用.all()查詢數據庫時,您正在查詢一次並創建一個QuerySet對象。然後,您可以做任何你想要的東西QuerySet欲瞭解更多信息,請參閱herehere