2011-07-01 58 views
5

說我有一個模型:django-taggit:有沒有辦法產生更少的db查詢?

class Entry(models.Model): 
    ... 
    tags = TaggableManager() 

當我在模板中遍歷Entry.objects.all(),entry.tags.all產生到數據庫中多了一個查詢。可以減少查詢數量嗎?使用像select_related()(我知道它不會工作,因爲django-taggit使用許多tomany關係,但我相信應該有一種方法來選擇所有條目與相關標籤在1命中)?

+0

可能重複的[Django的taggit預取\ _related](http://stackoverflow.com/questions/12926036/django-taggit-prefetch-related),或也許http://stackoverflow.com/questions/12204511/optimize-django-query-to-pull-foreign-key-and-django-taggit-relationship –

回答

0

嘗試使用Select Reverse它旨在通過單個查詢獲取多種關係的整體性。

2

從Django 1.4開始,您可以使用prefetch_related在單個查詢中檢索查詢集上的一對多關係。不幸的是,這與django-taggit不兼容,因爲'tags'屬性是一個管理者而不是真正的關係,所以prefetch_related無法理解它。相反,你需要遵循tagged_items關係:

entries = Entry.objects.prefetch_related('tagged_items__tag')

然後,您需要通過在模板代碼訪問預取的標籤有些類似的扭曲,因爲entry.tags.all將運行另一個查詢,而不是利用的預取:的

{% for tagged_item in entry.tagged_items %} 
    <li>{{ tagged_item.tag.name }}</li> 
{% endfor %} 
+2

只是一個註釋 - 這對我造成了一個GenericRelatedObjectManager錯誤。我將'entry.tagged_items'改爲'entry.tagged_items.all',它工作正常,但沒有改進對原始代碼的SQL查詢。困惑在這裏。 – Laurence

相關問題