2013-09-20 4 views
1

У меня есть некоторые проблемы, пытаясь создать мой SearchIndex с Haystack на Django, и я не знаю, что делать.Django Haystack - SearchIndex на основе нескольких моделей

Вот мои две модели:

# Meta: stores meta data about tutorials (category, title) 
class Meta(models.Model): 
    """ 
    Database [tutorial.meta] 
    """ 
    mta_title = models.CharField(max_length=TUTORIAL_TITLE_MAX) 
    mta_views = models.PositiveIntegerField(default=0) 


# Contents: stores the tutorial text content 
class Contents(models.Model): 
    """ 
    Database [tutorial.contents] 
    """ 
    tut_id = IdField() 
    cnt_body = BBCodeTextField() 

Теперь я хочу, чтобы основать свою SearchIndex на 3 следующих областях: mta_title, mta_views и cnt_body. Вот мой текущий SearchIndex:

from haystack import indexes 
from tutorial.models import Meta as TutorialMeta 
from account.models import Profile as UserProfile 


class TutorialMetaIndex(indexes.SearchIndex, indexes.Indexable): 
    text = indexes.CharField(document=True, use_template=True) 
    title = indexes.CharField(model_attr='mta_title') 
    views = indexes.CharField(model_attr='mta_views') 
    # Haystack reserves the content field names for internal use 
    cnt_body = indexes.CharField() 

    def get_model(self): 
     return TutorialMeta 

    def index_queryset(self, using=None): 
     """Used when the entire index for model is updated.""" 
     return self.get_model().objects.all() 

    def prepare_cnt_body(self, obj): 
     ???? 

Я видел on this question, что ответ должен был создать prepare_cnt_body. Но я не знаю, что я должен вернуть.

Спасибо всем.

ответ

1

Спасибо Sectio Aurea,

Но вот мое решение с простой подготовкой функции:

class TutorialIndex(indexes.SearchIndex, indexes.Indexable): 
    """ 
    Index the tutorials 
    """ 
    text = indexes.CharField(document=True, use_template=True) 
    tut_id = indexes.IntegerField(model_attr='tut_id') 
    cnt_body = indexes.CharField(model_attr='cnt_body') 
    mta_title = indexes.CharField() 
    mta_views = indexes.CharField() 

    def get_model(self): 
     """ 
     Return the current model 
     """ 
     return TutorialContents 

    def get_updated_field(self): 
     """ 
     Return the update date tracking field 
     """ 
     return "cnt_date" 

    def index_queryset(self, using=None): 
     """ 
     Used when the entire index for model is updated. 
     """ 
     return self.get_model().objects.all() 

    def prepare(self, object): 
     """ 
     Prepare the search data 
     """ 
     self.prepared_data = super(TutorialIndex, self).prepare(object) 

     # Retrieve the tutorial metas and return the prepared data 
     meta = get_tutorial_meta(id=object.tut_id) 
     self.prepared_data['mta_title'] = meta.mta_title 
     self.prepared_data['mta_views'] = meta.mta_views 

     return self.prepared_data 
+0

Интересной. В какой версии Django вы работаете? –

+0

Последний: 1.5.4. –

0

Не нужно «готовить». Просто используйте шаблон, который вы указали в поле «текст». В приложении «myapp» создайте шаблоны файлов/search/indexes/myapp/tutorialmeta_text.txt. В этом файле создайте следующие записи, используя стандартные ссылки модели языка шаблонов Django, что-то вроде:

{{object.mta_title}} 
{{object.mta_views}} 
{{object.contents.cnt_body}} 

Тогда вам необходимо перестроить индекс с новым шаблоном (./manage.py rebuild_index). Это будет индексировать каждое из трех указанных полей для каждого объекта. С помощью этого метода вы также можете опустить поля «title», «views» и «cnt_body» из вашего класса SearchIndex, а также метод «подготовить».

Смежные вопросы