是否可以获得带有相关评论的对象?现在 django 评论框架为每个具有相关评论的对象创建查询,并为评论所有者创建另一个查询。我能以某种方式避免这种情况吗?我使用 django 1.4,所以 prefetch_related 是允许的。
问问题
1122 次
1 回答
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
您可以扩展 Comment 模型并在那里添加 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())
您可以通过在comment_was_posted上使用cache.incr()和在 post_delete 上使用 cache.decr()来改进最后一个片段,但这留给您作为练习:)
于 2012-03-07T19:44:09.303 回答