【问题标题】:Get comments for object using one query使用一个查询获取对象的评论
【发布时间】:2012-03-07 13:38:39
【问题描述】:

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

【问题讨论】:

  • cmets 框架使用通用外键将 cmets 与对象相关联。根据定义,它需要多个查询,因为它必须查找ContentType,然后使用它来获取实际对象。

标签: django django-models django-comments


【解决方案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。或者将 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())

你可以改进最后的 sn-p,通过在 comment_was_posted 上使用 cache.incr() 和在 post_delete 上使用 cache.decr() 但这留给你作为练习:)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-09
    • 2013-05-25
    • 1970-01-01
    • 1970-01-01
    • 2012-02-11
    • 2023-02-17
    相关资源
    最近更新 更多