我在我的项目中使用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']
仍然为每个循环命中数据库。
你们有没有同样的问题?你是怎么解决的?或者我应该更改为另一个评级应用程序?谢谢。
答案 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
希望这会有所帮助......