2010-10-18 33 views
0

我有兩個表:Actor和Images。 Images表通過外鍵鏈接到Actor表。我可能會在Actor上查詢一個名字以A開頭的所有actor。假設我將這個查詢結果存儲在actor_list中,並將它傳遞給模板。通過迭代,我可以通過模板獲取所有圖像的列表。例如:django查詢費用

{% for actor in actor_list %} 
    {% for image in actor.img_set %} 
     {{ image }} 
    {% endfor %} 
{% endfor %} 

這對數據庫來說代價高嗎?每次我調用actor.img_set時,關聯的img_set是否會與最初的actor對象列表通過,或者新的查詢是否會觸發數據庫?

回答

0

您應該安裝Django debug toolbar並查看封面下正在發生的SQL查詢。

如果查詢太多,可以嘗試使用select_related()在初始查詢中提取相關數據。

+1

同意調試工具欄的建議,但是'select_related()'在反向關係的情況下是無效的,這似乎是。 – 2010-10-18 12:46:34

+0

@ed:除了Daniel的評論和你的最後一個問題:如果這是一個反向關係,數據庫將被擊中每個演員得到他的形象設置... – 2010-10-18 12:54:00

+0

感謝您的輸入。後續問題。在從Django調試工具欄中檢查SQL後,我發現數據庫即使是這樣:{{actor_list.0.id}}。爲什麼在創建actor_list時SQL查詢已經結束?但是如果我迭代actor_list並以這種方式拉取id,則不會創建額外的查詢 – 2010-10-19 14:37:10

0

比使用django工具欄更好的是使用連接庫。將調試設置爲True:

>>> from django.db import connection 
>>> for actor in actor_list: 
>>> for image in actor.img_set: 
>>> image 
>>> connection.queries() 

這將顯示所有已執行的查詢以及每個執行的時間量。

雖然調試工具欄很酷,但對於很多用途。 :-)