【问题标题】:django simple ratings, too much querydjango 简单评分,查询太多
【发布时间】:2012-12-26 04:23:57
【问题描述】:

我在我的项目中使用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']

仍然为每个循环访问数据库。

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

【问题讨论】:

  • 你解决过这个问题吗?感谢分享

标签: python django django-ratings


【解决方案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

希望这会有所帮助...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-11-12
    • 1970-01-01
    • 2011-05-17
    • 1970-01-01
    • 2017-09-24
    • 2013-04-08
    • 1970-01-01
    相关资源
    最近更新 更多