Получить комментарии для объекта, используя один запрос - PullRequest
0 голосов
/ 07 марта 2012

Можно ли получить объект с комментариями к нему?Прямо сейчас структура комментариев django создает запрос для каждого объекта, у которого есть связанные комментарии, и другие запросы для владельцев комментариев.Можно ли как-то избежать этого?Я использую django 1.4, поэтому prefetch_related разрешен.

1 Ответ

3 голосов
/ 07 марта 2012

Вы можете создать функцию, которая кэширует счет:

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

Вы можете расширить модель комментариев и добавить туда 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 и cache.decr () на post_delete, но это оставлено для вас как упражнение :)

...