Django-Haystack - 如何使用django评论干草堆?

时间:2013-03-12 00:00:59

标签: django-haystack

我正在与Django-Haystack斗争。

我需要做一篇包含文章和评论文章的索引。我怀疑的是如何在文章和评论中加入基于文档的索引。

如何在评论和文章中搜索关键字并输出包含该关键字的文章(文章评论,文章)?

有可能吗?

最诚挚的问候,

2 个答案:

答案 0 :(得分:3)

首先要做的是忘记SearchIndex必须与模型完全对应的概念。它只来自一个。

最简单的方法是使用模板将注释添加到索引文档中。这会将您的Article模型设为title字段:

class ArticleIndex(SearchIndex, indexes.Indexable):
    text = CharField(document=True, use_template=True)
    title = CharField(model_attr='title')

    def get_model(self):
        return Article

请注意,关键字参数use_template设置为true。默认值为search/indexes/{app_label}/{model_name}_{field_name}.txt。在该模板中,只输出您要编制索引的内容。 E.g。

{{ object.title|safe }}

{{ object.body|safe }}

{% for comment in object.comments.all %}
{{ comment|safe }}
{% endfor %}

虽然我担心这里特定的反向关系名称可能是错误的,但这是你想要做的事情的要点。同样,这是完成您明确陈述的一种简单方法。

答案 1 :(得分:0)

这对我有用:

models.py中,假设评论附加到Article,您需要一个方法来返回附加到它的评论(没有简单的方法可以执行此操作):

class Article:
    def comments(self):
        ids = [self.id]
        ctype = ContentType.objects.get_for_model(Article)
        comments = Comment.objects.filter(content_type=ctype,
                                          object_pk__in=ids,
                                          is_removed=False)
        return comments

search_indexes.py中,确保ArticleIndexuse_template=True

from django.contrib.contenttypes.models import ContentType
from django.contrib.comments.models import Comment

class ArticleIndex(SearchIndex):
    text = CharField(use_template=True)

在您的索引模板中,例如templates/search/indexes/article_text.txt

{% for comment in object.comments.all %}
    {{ comment }}
{% endfor %}

现在,唯一剩下的问题是在添加或删除注释时更新该特定索引对象。我们在这里使用信号:

在models.py中:

from django.dispatch import receiver
from haystack import site
from django.contrib.comments.signals import (comment_was_posted,
                                             comment_was_flagged)

@receiver(comment_was_posted)
def comment_posted(sender, **kwargs):
    site.get_index(Article).update_object(kwargs['comment'].content_object)


@receiver(comment_was_flagged)
def comment_flagged(sender, **kwargs):
    site.get_index(Article).update_object(kwargs['comment'].content_object)