使用一个查询获取对象的注释

时间:2012-03-07 13:38:40

标签: django django-models django-comments

是否可以获得与之相关的评论对象?现在,django评论框架为每个具有相关评论的对象创建查询,并为评论所有者创建另一个查询。我可以以某种方式避免这个吗?我使用django 1.4,因此允许使用prefetch_related。

1 个答案:

答案 0 :(得分:3)

您可以创建一个缓存计数的函数:

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。或者将get_comment_count作为模板过滤器。没关系。

当然,在发布新评论时,您还需要缓存失效:

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())

您可以使用cache.incr()上的comment_was_posted和post_delete上的cache.decr()来改进最后一个片段,但这样做是为了练习:)