Вы можете создать функцию, которая кэширует счет:
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, но это оставлено для вас как упражнение :)