3

我在我的项目中使用django-simple-ratings。我将它连接ratings到我的Post应用程序,因此用户可以投票赞成/反对,然后按分数排序。我想要的几乎都包含在ratings应用程序中。有这个页面我需要列出所有的Post(就像stackoverflow一样)。但是对于我显示评级的每一个post地方Post,它都会击中数据库,这会使网站速度变慢。模型.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']

对于每个循环,它都会命中数据库,再试一次:

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

仍然为每个循环打分贝。

你们中有人有同样的问题吗?你是怎么解决的?或者我应该改用另一个评分应用程序吗?谢谢你。

4

1 回答 1

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

希望这可以帮助...

于 2012-12-26T04:57:34.630 回答