2013-05-22 2 views
1

Как вы фильтруете/присоединяетесь к Haystack SearchQuerySet с помощью соответствующих полей модели?Как фильтровать Haystack SearchQuerySets по родственным моделям

У меня есть запрос, как:

sqs = SearchQuerySet().models(models.Person) 

и это возвращает те же результаты, что эквивалентные доходности админ страниц.

Однако, если я пытаюсь и фильтр модели записей, связанных с внешним ключом:

sqs = sqs.filter(workplace__role__name='teacher') 

она ничего не возвращает, даже если на странице /admin/myapp/person/?workplace__role__name=teacher возвращает несколько записей.

Я не хочу делать полнотекстовый поиск этих связанных моделей. Я просто хочу сделать простой фильтр с точным соответствием. Возможно ли это с Haystack?

ответ

5

Вы не можете выполнять объединения, используя поисковую систему, такую ​​как поддерживаемые сторой сена. делать запросы, как это вам нужно добавить информацию, которую вы хотите фильтровать в «Денормализованную» моде в индексе поиска:

class ProfileIndex(indexes.SearchIndex, indexes.Indexable): 
    # your other fields, most likely model attributes 
    role_name = indexes.CharField() 

    def get_model(self): 
     return Person 

    def prepare_role_name(self, person): 
     return person.workplace.role_name 

Тогда можно отфильтровать по полю role_name. Просто убедитесь, что обновите свой индекс, если, например. имя изменяется, тогда вы должны обновить все соответствующие записи в индексе поиска.

+0

Ваш конкретный пример не имеет смысла, так как ссылка person-> workplace является отношением друг к другу. – Cerin

+0

Ну, вот как работают эти поисковые системы ... С другой стороны, доступ к этой денормализованной информации является сверхбыстрой, потому что вам не нужно делать никаких дальнейших поисков/соединений для доступа к нему. Если вы избегаете попадания в базу данных при отображении результатов поиска, вы можете получить большое преимущество в производительности ... Также см. Этот http://django-haystack.readthedocs.org/en/latest/best_practices.html#avoid-hitting-the- база данных –

+0

Не знаю, какой именно формат данных ... Вы можете сделать то же самое, что и выше, с отношением от одного до многих, используя «MultiValueField» в стоге сена, который может содержать список (и вы можете фильтровать отдельные значения). См. Этот gist https://gist.github.com/cooncesean/2892533 –

0

Вы также можете сделать это:

class ProfileIndex(indexes.SearchIndex, indexes.Indexable): 
    # your other fields, most likely model attributes 
    role_name = indexes.CharField(model_attr='workplace__role__name') 

    def get_model(self): 
     return Person 

И вы можете фильтровать по ROLE_NAME. Я видел это здесь. http://django-haystack.readthedocs.org/en/latest/searchindex_api.html

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