2012-08-23 33 views
0

我需要獲取給定提供者的所有用戶列表。用戶可能有多個提供者,而提供者可能有多個用戶。以下是我迄今爲止:如何改進以下查詢

我有以下表格:

class Provider(models.Model): 
    provider = models.CharField(max_length=100, primary_key=True) 

class UserProfile(models.Model): 
    user = models.ForeignKey(User, primary_key=True) 
    provider = models.ManyToManyField(Provider, db_column='provider') 

筆者認爲:

providers = Provider.objects.order_by('provider') 

而且在我的模板:

{% for provider in providers %} 
<tr> 
    <td class="provider"> 
     {{ provider.provider }} 
    </td> 
    <td class="email"> 
     {% for profile in provider.userprofile_set.all %} 
      {{ profile.user }} 
     {% endfor %}  
    </td> 
</tr> 
{% endfor %} 

這將產生大約250個查詢,因爲我正在迭代模板中的提供者查詢集。我將如何改進上述 - 有沒有在這裏使用prefetch_relatedselect_related的方法?

回答

1

使用prefetch_related();從文檔

providers = Provider.objects.order_by('provider').all().prefetch_related('userprofile_set') 

select _related()不上ManyToManyField的工作

返回QuerySet會自動檢索,單批,涉及每個指定查找的對象。

這與select_related具有類似的目的,因爲兩者都旨在阻止訪問相關對象導致的大量數據庫查詢,但策略是完全不同的。

...

prefetch_related,在另一方面,不爲每個關係的單獨的查找,並且確實在Python「接合」。這樣,除了select_related支持的外鍵和一對一關係以外,它還允許預取多對多和多對一對象,這些對象不能使用select_related來完成。

0

我不使用Django的,但我只是在這裏找到了答案:docs.djangoproject.com

providers = Provider.objects.select_related().order_by('provider').all() 
+0

是的,這就是我最初的嘗試,沒有任何改善。 – David542

+0

哦,你有沒有試過添加「all()」? – Besnik

+0

在這種情況下,所有東西都是多餘的 - (測試它完全一樣)。 – David542