2013-08-01 6 views
1

Я использую Django Haystack v2.0.0 и Whoosh v2.4.0. Согласно индексам поиска Haystack documentation, можно использовать поиск по полю Django в параметре model_attr. Однако, выполнив следующий код, используя команду оболочки manage.py:Haystack SearchIndex model_attr не соответствует правильному отношению?

from haystack.query import SearchQuerySet 
for r in SearchQuerySet(): 
    print r.recruitment_agency # Prints True for every job 
    print r.recruitment_agency == r.object.employer.recruitment_agency 
    # Prints False if r.object.employer.recruitment_agency is False 

Я попытался перестроить индекс несколько раз, каталог индекса является записываемым, и я не получаю никаких сообщений об ошибках. Все остальные поля работают должным образом.

У меня есть следующая (упрощенная) модель:
компания/models.py:

class Company(models.Model): 
    recruitment_agency = models.BooleanField(default=False) 

работа/models.py:

class Job(models.Model): 
    employer = models.ForeignKey(Company, related_name='jobs') 

работа/search_indexes.py:

class JobIndex(indexes.SearchIndex, indexes.Indexable): 
    text = indexes.CharField(document=True, use_template=True) 
    recruitment_agency = indexes.BooleanField(model_attr='employer__recruitment_agency') 

    def get_model(self): 
     return Job 

jobs/forms.py:

class JobSearchForm(SearchForm): 
    no_recruitment_agencies = forms.BooleanField(label="Hide recruitment agencies", required=False) 

    def search(self): 
     sqs = super(JobSearchForm, self).search() 

     if self.cleaned_data['no_recruitment_agencies']: 
      sqs = sqs.filter(recruitment_agency=False) 

     return sqs 

Кто-нибудь знает, в чем проблема?

+0

вы решить эту проблему? У меня есть [аналогичная проблема, см. Здесь] (http://stackoverflow.com/questions/20878754/haystack-indexing-related-model-issue), ваша помощь будет высоко оценена. – user2104778

ответ

0

Между тем я перешел на бэкэнд ElasticSearch, но проблема осталась, что указывает на то, что это может быть проблемой в стоге сена, а не в Whoosh.

Проблема заключается в том, что значения python True и False не сохраняются в виде логических значений, а как строка, и они не преобразуются обратно в значения boolean. Чтобы фильтр логических значений, вы должны проверить струны 'true' и 'false':

class JobSearchForm(SearchForm): 
    no_recruitment_agencies = forms.BooleanField(label="Hide recruitment agencies", required=False) 

    def search(self): 
     sqs = super(JobSearchForm, self).search() 

     if self.cleaned_data['no_recruitment_agencies']: 
      sqs = sqs.filter(recruitment_agency='false') # Change the filter here 

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