2011-06-21 102 views
4

對Django做事的方式並不陌生,但是我確信可以更有效地完成一系列循環。基本上,我有一組相關的對象,我需要深入查看圖表以檢索結束相關對象的值。我循環下來的對象,最終得到我想要的值。請參閱下面的代碼:高效的Django查詢

  for media in campaign.media_set.all(): 
       media_key = media.key 
       for target in media.target_set.all(): 
        x = target.x 
        y = target.y 
        target_id = target.id 
        for metatag in target.metatag_set.all(): 
         body = metatag.body 
         hdr = metatag.header 
         ftr = metatag.footer 
         ct_url = metatag.clickthrough 
         point_url = metatag.point.image_file 

任何指針的方式來做少數據庫選擇?

回答

4

是的,你正在倒退。這是我在使用Django時遇到的很多問題。這是最簡單的開始與你想檢索的對象和向後工作,以滿足所有條件。即它看起來像你想要關於這個metatag的一些信息,所以從此開始。

MetaTag.objects.filter(conditions_here) 

然後檢索其他的東西像這樣的目標X/Y只是使用在MetaTag對象上創建的自動related_name性能。很難說沒有看到你的模型。

+1

完美。感謝您的建議。這可以歸結爲: MetaTag.objects.filter(target__media__campaign__in = campaigns): – Jiyosub

1

一般來說,這是一個偉大的閱讀:https://docs.djangoproject.com/en/dev/topics/db/optimization/

可能只是增加一個select_related之前您最初的搜索可能顯著幫助。

+0

select_related在這種情況下不會做任何事情。他在循環中追蹤外鍵select_related幫助如果你正在追蹤他們 – John

0

這幾乎不可能在沒有看到模型定義的情況下回答。如果這些關係是ForiegnKey關係,那麼最有可能完全消除外部循環,只需按照外部關鍵字生成所有數據(select_related當然可以一次獲得所有數據)

但是,重新審視多種多樣的關係,並且爲此你不能僅僅導航外鍵,你所擁有的答案可能是你能做的最好的。