2012-12-26 32 views
3

我在我的項目上使用django-simple-ratings。我將ratings掛接到我的Post應用程序,以便用戶可以上/下投票,然後按比分排序。幾乎我想要的是包含在ratings應用程序中。有這個網頁,我需要列出所有的Post(就像stackoverflow)。但每postPost其中我顯示的評級,它擊中分貝,並使網站reeeaaall緩慢。 models.py:django簡單評分,太多查詢

from ratings.models import Ratings, RatedItemBase 

class PostRatings(RatedItemBase): 

    content_object = models.ForeignKey('Post') 

class Post(models.Model): 

    title = models.CharField(max_length = 200) 
    content = models.TextField() 
    ratings = Ratings(PostRatings) 

for q in Post.objects.all(): 
    print q.ratings.cumulative_score() 
    #or 
    print q.postratings_set.aggregate(Sum('score'))['score__sum'] 

對於每一個循環,它擊中了分貝,另一個嘗試:

for q in Post.objects.prefetch_related('postratings_set'): 
    print q.postratings_set.aggregate(Sum('score'))['score__sum'] 

仍然擊中分貝每一個循環。

你們有沒有同樣的問題?你是如何解決它的?或者我應該更換爲另一個評級應用程序?謝謝。

+0

你有沒有解決這個問題?感謝分享 –

回答

1

我懷疑可能有JOIN類型的查詢沒有適當的索引。但是您需要發佈或檢查Django ORM實際執行的查詢。只有這樣才能出現優化的解決方案。爲此,有一個完美的工具Django-debug

安裝此應用程序後,您可以使用debugsqlshell。在此模式下運行模型會輸出在Python交互式shell中工作時執行的SQL。例如 -

$ ./manage.py debugsqlshell 
Python 2.6.1 (r261:67515, Jul 7 2009, 23:51:51) 
[GCC 4.2.1 (Apple Inc. build 5646)] on darwin 
Type "help", "copyright", "credits" or "license" for more information. 
(InteractiveConsole) 
>>> from page.models import Page 
>>> ### Lookup and use resulting in an extra query... 
>>> p = Page.objects.get(pk=1) 
SELECT "page_page"."id", 
     "page_page"."number", 
     "page_page"."template_id", 
     "page_page"."description" 
FROM "page_page" 
WHERE "page_page"."id" = 1 

希望這有助於...