django简单收视率,查询太多

时间:2012-12-26 04:23:58

标签: python django django-ratings

我在我的项目中使用django-simple-ratings。我将ratings挂钩到我的Post应用,因此用户可以向上/向下投票,然后按分数进行排序。我想要的几乎包含在ratings应用程序中。这个页面我需要列出所有Post(就像stackoverflow一样)。但对于显示评级的post中的每个Post,它都会点击数据库,这会使网站变得缓慢。 models.py:

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']

对于每个循环,它都会点击db,另一次尝试:

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

仍然为每个循环命中数据库。

你们有没有同样的问题?你是怎么解决的?或者我应该更改为另一个评级应用程序?谢谢。

1 个答案:

答案 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

希望这会有所帮助......