Для недавних зрителей вот решение на основе нового RealtimeSignalProcessor:
В myapp / signal.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__bar
или для полей «многие ко многим». Но это должно быть просто расширить, чтобы обработать их, если вам нужно.)