Django haystack Haystack-为什么RealtimeSearchIndex有时不更新我保存的对象
我在用干草堆和嗖嗖声来对付Django 在search_index.py中,我有这个Django haystack Haystack-为什么RealtimeSearchIndex有时不更新我保存的对象,django-haystack,Django Haystack,我在用干草堆和嗖嗖声来对付Django 在search_index.py中,我有这个 class PageIndex(RealTimeSearchIndex): text = CharField(document=True, use_template=True) creator = CharField(model_attr='creator') created = DateTimeField(model_attr='created') org = CharFiel
class PageIndex(RealTimeSearchIndex):
text = CharField(document=True, use_template=True)
creator = CharField(model_attr='creator')
created = DateTimeField(model_attr='created')
org = CharField(model_attr='organisation')
site.register(Page, PageIndex)
我的模板看起来像这样
{{ object.name }}
{{ object.description }}
{{ object.template|striptags }}
{% for k,v in object.get_variables.items %}
{{ v }}
{% endfor %}
如果我用更新的名称或描述保存页面,那么它会立即更新,并在模板中包含get_variables.items中的变量。但是,如果我只更新变量,那么它不会更新
是不是因为变量是另一个与其相关的对象,即使我保存在同一页上,它也不会拾取对该页的更改?如果是这样,我如何在更新相关对象时强制更新页面项目?A仅在保存或删除注册的模型时更新搜索索引,或者更准确地说,在发出模型的post\u save/post\u delete
信号时更新搜索索引。如果删除/保存相关模型或执行批量更新/删除操作,则不会发出这些信号
为了解决您的问题,您可以创建RealTimeSearchIndex
的子类,该子类还可以更新相关模型的post\u save/post\u delete
信号上的索引。我同意,但我认为最简单的解决方案是将侦听器附加到相关模型的post\u save信号上(请参见),重新建立模型的索引
例如,在myapp/models.py中,给定的模型MyRelatedModel具有MyModel的外键
from myapp.search_indexes import MyModelIndex
def reindex_mymodel(sender, **kwargs):
MyModelIndex().update_object(kwargs['instance'].mymodel)
models.signals.post_save.connect(reindex_mymodel, sender=MyRelatedModel)
这篇文章的近期读者需要注意的是——RealTimeSearchIndex已经被弃用了
有关它的Haystack帖子,请参见。对于最近的观众,这里有一个基于新RealtimeSignalProcessor的解决方案: 在myapp/signals.py中:
class RelatedRealtimeSignalProcessor(RealtimeSignalProcessor):
def handle_save(self, sender, instance, **kwargs):
if hasattr(instance, 'reindex_related'):
for related in instance.reindex_related:
related_obj = getattr(instance, related)
self.handle_save(related_obj.__class__, related_obj)
return super(RelatedRealtimeSignalProcessor, self).handle_save(sender, instance, **kwargs)
def handle_delete(self, sender, instance, **kwargs):
if hasattr(instance, 'reindex_related'):
for related in instance.reindex_related:
related_obj = getattr(instance, related)
self.handle_delete(related_obj.__class__, related_obj)
return super(RelatedRealtimeSignalProcessor, self).handle_delete(sender, instance, **kwargs)
在settings.py中:
HAYSTACK_SIGNAL_PROCESSOR = 'myapp.signals.RelatedRealtimeSignalProcessor'
在models.py中:
class Variable(models.Model):
reindex_related = ('page',)
page = models.ForeignKey(Page)
现在,当保存变量时,相关页面的索引也将更新
(TODO:这不适用于像
foo\uu bar
这样的扩展关系,也不适用于多对多字段。但如果需要,扩展它来处理这些字段应该很简单。)您找到过解决方案吗?我也有同样的问题,我想在这个阶段它可能不会被构建到Django Haystack中(但我会研究它)。