3

プロジェクトでdjango-simple-ratingsを使用しています。ratingsを自分のアプリにフックして、Postユーザーが上下に投票し、スコアで並べ替えることができるようにします。私が欲しいものはほとんどratingsアプリに含まれています。すべてをリストする必要があるこのページがありますPost(ちょうどstackoverflowのように)。しかし、評価を表示するたびpostPost、データベースにヒットし、サイトが非常に遅くなります。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']

ループごとに、データベースにヒットし、もう一度試してください:

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 インタラクティブ シェルで作業するときに実行される 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 に答える