2012-03-07 9 views
0

それに関連するコメントを持つオブジェクトを取得することは可能ですか?現在、djangoコメントフレームワークは、関連するコメントを持つすべてのオブジェクトとコメント所有者のための別のクエリを作成します。どういうわけかこれを避けることはできますか?私はdjango 1.4を使用してprefetch_relatedを許可しています。1つのクエリを使用してオブジェクトに対するコメントを取得する

from django.contrib.contenttypes.models import ContentType 
from django.contrib import comments 

def get_comment_count_key(model): 
    content_type = ContentType.objects.get_for_model(model) 
    return 'comment_count_%s_%s' % (content_type.pk, model.pk) 

def get_comment_count(model): 
    key = get_comment_count_key(model) 
    value = cache.get(key) 
    if value is None: 
     value = comments.get_model().objects.filter(
      content_type = ContentType.objects.get_for_model(model), 
      object_pk = model.pk, 
      site__pk = settings.SITE_ID 
     ).count() 
     cache.set(key, value) 
    return value 

あなたでしextend the Comment modelをして、そこget_comment_countを追加します。

+0

コメントフレームワークは、一般的な外部キーを使用してコメントをオブジェクトに関連付けます。定義すると、 'ContentType'をルックアップしてから実際のオブジェクトをフェッチするために複数のクエリが必要です。 –

答えて

2

あなたは、カウントをキャッシュする機能を作成することができます。または、get_comment_countをテンプレートフィルタとして配置します。それは問題ではありません。もちろん

、新しいコメントが投稿されたとき、あなたはまた、キャッシュの無効化が必要になりますpost_deleteに)あなたが(comment_was_postedcache.incr()を使用することによって、この最後のスニペットを改善し、cache.decrでき

from django.db.models import signals 
from django.contrib import comments 

def refresh_comment_count(sender, instance, **kwargs): 
    cache.delete(get_comment_count_key(instance.content_object)) 
    get_comment_count(instance.content_object) 
post_save.connect(refresh_comment_count, sender=comments.get_model()) 
post_delete.connect(refresh_comment_count, sender=comments.get_model()) 

それはですあなたのための練習として残しました。

関連する問題