我使用Haystack索引内部有html的字段,我想确认我所做的事情是有道理的,因为这个索引业务对我来说很近。
考虑以下模型:
class Document(models.Model):
name = models.CharField(max_length=200)
date = models.DateField()
text = models.TextField() # has html
summary = models.TextField() # has html
def compose_summary(self):
# searches for tags in html and substitute for other tags (for rendering)
def visible_summary(self):
# returns summary without html.
def visible_text(self):
# returns text without html.
我想创建一个SearchIndex
。特别是我想将搜索结果总结为:
<h4><a href="{{ law.get_absolute_url }}">{{ law.name }}</a></h4>
<div class="age">{{law.date}}</div>
<p>{{ law.compose_summary|safe }}</p>
我想在所有领域进行搜索。
我现在的做法是:
class DocumentIndex(indexes.SearchIndex, indexes.Indexable):
id = indexes.IntegerField(model_attr='id', indexed=False) # for get_absolute_url
name = indexes.CharField(model_attr='name', indexed=False)
date = indexes.DateField(model_attr='date')
text = indexes.CharField(document=True, use_template=True)
summary = indexes.DateField(model_attr='summary', indexed=False)
def get_model(self):
return Document
def compose_summary(self):
# copy of Document.compose_summary().
def get_absolute_url(self):
# copy of Document.get_absolute_url().
# document_text.txt
{{ object.name }}
{{ object.visible_summary }}
{{ object.visible_text }}
但是,我不确定这是正确的方法:我在至少两种情况下(函数)重复代码,我认为这是存储摘要的内容三次:一次在数据库(Document.summary
),DocumentIndex.summary
中的一个和DocumentIndex.text
内的一个。有人可以给我一个提示是否有意义吗?
答案 0 :(得分:0)
解决您的两个问题:
无需重复DocumentIndex
对象中的代码,您可以通过例如访问相关的Document
对象。 {{ law.object.get_absolute_url }}
所以请将代码放在Document
是的,summary
将被存储三次,一次存储在数据库中,两次存储在索引中,没有任何问题。仅供参考,DocumentIndex.text将通过您的模板填充,因此它不仅包含摘要,还包含您想要编入索引的所有内容。