我在 Django-Haystack 上苦苦挣扎。
我需要做一个包含文章和评论文章的索引。我的疑问是如何将文章和评论放入基于文档的索引中。
如何在评论和文章中搜索关键字并输出带有该关键字的文章(文章评论,文章)?
有可能的?
此致,
我在 Django-Haystack 上苦苦挣扎。
我需要做一个包含文章和评论文章的索引。我的疑问是如何将文章和评论放入基于文档的索引中。
如何在评论和文章中搜索关键字并输出带有该关键字的文章(文章评论,文章)?
有可能的?
此致,
首先要做的是忘记 aSearchIndex
必须与模型完全对应的概念。它只来自一个。
最简单的方法是使用模板将注释添加到索引文档中。这假定您的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。在该模板中,只需输出您要索引的内容。例如
{{ object.title|safe }}
{{ object.body|safe }}
{% for comment in object.comments.all %}
{{ comment|safe }}
{% endfor %}
虽然我担心这里的特定反向关系名称可能是错误的,但这就是你想要做的事情的要点。同样,这是完成您具体说明的简单方法。
这对我有用:
在你的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
,确保ArticleIndex
有use_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)