Django haystack Haystack-为什么RealtimeSearchIndex有时不更新我保存的对象

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

我在用干草堆和嗖嗖声来对付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 = 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中(但我会研究它)。