2011-08-12 4 views
10

私は私が持っているsearch_index.py内ジャンゴ干し草 - なぜRealtimeSearchIndexは時々私の保存されたオブジェクトは更新されません

でヘイスタックとヒューという音を使用しています。この

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の変数が含まれます。しかし、変数を更新するだけでは更新されません。

変数はそれに関連する別のオブジェクトなので、同じページに保存していても、ページに変更はありませんか?もしそうなら、私は関連するオブジェクトを更新しているときにPageアイテムを更新するように強制するのですか?

+0

が今まであなたをしましたこれに対する解決策を見つけるか?私は同じ問題を抱えています。この段階でDjango Haystackに組み込まれていない可能性があります(しかし、私はそれを調べます)。 –

答えて

6

RealTimeSearchIndexは、登録されているモデルが保存または削除されたとき、またはより正確にモデルのpost_save/post_delete信号が放出されたときにのみ検索インデックスを更新します。これらの信号は、関連するモデルが削除/保存された場合、または一括更新/削除操作が実行された場合には放出されません。

問題を解決するには、RealTimeSearchIndexというサブクラスを作成し、関連するモデルのpost_save/post_deleteシグナルのインデックスも更新することができます。

8

私はDaniel Hepperと同意しますが、ここで最も簡単な解決策は、リスナーを関連モデルのpost_save信号(https://docs.djangoproject.com/en/dev/topics/signals/を参照)に添付してモデルを再索引付けすることです。

例えば、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) 
5

この記事のより最近の視聴者のためだけのノートへのForeignKeyを持っているmyappに/ models.py、与えられたモデルMyRelatedModelに---- RealTimeSearchIndexが廃止されました。

ヘイスタック投稿については、hereを参照してください。 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で:

​​

モデルで、最近の視聴者のために

4

は、ここに新しいRealtimeSignalProcessorに基づくソリューションです。 py:

class Variable(models.Model): 
    reindex_related = ('page',) 

    page = models.ForeignKey(Page) 

変数が保存されると、関連するページのインデックスも更新されます。

(TODO:。。これはfoo__barのような拡張された関係、または多対多の分野では動作しません。しかし、あなたがする必要がある場合は、それらを処理するためにそれを拡張することは簡単でなければなりません)

+0

これは受け入れられた回答としてマークする必要があります。 – aabele

関連する問題