2012-11-07 59 views
1

Django的查詢優化,我發現這個代碼一個位(粗體)在我的模板,生成〜250個查詢,使事情變得很慢:具有多對多場

{% for part in latestupdates %} 
{{ part }} 
     **{% for unipart in part.uniparts.all|slice:":5" %}** 
     <tr> 
     <td> 
      <p style ="font-size:12px;"><a href = "/spices/{{ unipart_id }}/view_part">{{ unipart.part }}</a></p></td> 
     <td><img src="{{ STATIC_URL }}images/company_logos/thumbs/{{part.model.all.0.manufacturer}}.jpg" alt="{{part.model.all.0.manufacturer}} {{unipart.part}}" height="24" width='115' /></td> 
     </tr> 
     {% endfor %} 
{% endfor %} 

Unipart和部分之間的關​​系是如下:

class UniPart (models.Model): 
    model = models.ManyToManyField (Part, related_name = 'uniparts') 

我的看法如下:

latestupdates = Part.objects.all().order_by('-added')

基本上我想要的是獲得鏈接到零件的5個Unipart對象。但是這是耗費我很大的時間!什麼是比我做的更有效的方式?我其實有> 600個數據庫查詢,這是非常可悲的,我正在閱讀數據庫優化,但對於這一點,我找不到任何相關的。幫幫我! :-)

回答

3

嘗試prefetch_related() QuerySet的方法。

latestparts = Part.objects.all().prefetch_related('uniparts').order_by('-added') 

但要注意試圖預取的項目數量。因爲它可以使你記憶力過剩。

是的,這隻適用於django 1.4我認爲。

使用select_related()如果你有models.ForeignKey字段(不是你的情況)。這適用於舊版本的django。

+0

我有Django 1.3!有其他選擇嗎? – user1328021

+0

沒有簡單的方法。你可以自己預取它。你所能做的就是做兩個查詢,然後用ids連接它們。但這是瘋狂的工作。你需要非常小心,不要加重你的記憶力。 – Pol

+0

好吧,我將嘗試更新到1.4,看看會發生什麼。如果我的應用程序沒有中斷,我會嘗試你的建議。謝謝並期待更新! – user1328021