2013-10-07 2 views
6

Попытка фильтровать SearchQuerySet с помощью логического значения для меня не работает. (Я использую предоставленный «Simple» поиск бэкенд двигателя во время тестирования.)Django Haystack - Как фильтровать результаты поиска по логическому полю?

У меня есть индекс, как:

class MyIndex(indexes.SearchIndex, indexes.Indexable): 
    text = indexes.CharField(document=True, use_template=True) 
    has_been_sent = indexes.BooleanField(model_attr='has_been_sent') 
    # other fields 

    def get_model(self): 
     return MyModel 

И я использую пользовательскую форму для поиска:

BOOLEAN_OPTIONS = [ ('either', 'Either'), ('yes', 'Yes'), ('no', 'No') ] 

class MyModelSearchForm(SearchForm): 
    # other fields 
    has_been_sent = forms.ChoiceField(widget = forms.Select(), label = 'Sent?', choices=BOOLEAN_OPTIONS) 

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

    if not self.is_valid(): return self.no_query_found() 

    sqs = sqs.models(MyModel) # cuts out other models from the search results 
    if self.cleaned_data['has_been_sent'] != 'either': 
     if self.cleaned_data['has_been_sent'] == 'yes': sent = True 
     else: sent = False 
     sqs = sqs.filter(has_been_sent=sent) 

    return sqs 

Если я установил параметр has_been_sent в Да или Нет в форме, я всегда получаю 0 результатов, что явно неверно. Я тоже пытался в оболочке, без везения. sqs.filter(has_been_sent=True) и sqs.filter(has_been_sent=False) оба возвращают пустой список, EVEN THOUGH sqs.values('has_been_sent') ясно показывает кучу записей с Истинными значениями для has_been_sent. И даже незнакомец, sqs.filter(has_been_sent='t') возвращает подмножество записей, а также «f», «a» и несвязанные буквы типа «j»! У меня полная потеря. У кого-нибудь есть опыт работы с подобной проблемой с Haystack?

В соответствующих примечаниях поля, которые вы фильтруете через SearchQuerySet().filter() из полей индекса (в search_indexes.py) или полей модели (на их соответствующих models.py)?

EDIT:

Я пытается проверить мои фильтры через manage.py оболочки Джанго, но я думаю, что я делаю неправильно. Кажется, что это не похоже на мой search_indexes.py, так как я ограничил его подмножеством MyModel с помощью метода index_queryset(), но я получаю ВСЕ объекты MyModel в оболочке.

>>> from haystack.query import SearchQuerySet 
>>> from myapp.models import MyModel 
>>> sqs = SearchQuerySet().models(MyModel) 

И тогда некоторые испытания:

>>> len(sqs) # SHOULD be 5, due to the index_queryset() method I defined in search_indexes.py 
17794 
>>> sqs.filter(has_been_sent='true') # Same happens for True, 'TRUE', and all forms of false 
[] 
>>> len(sqs.filter(not_a_real_field='g')) # Made-up filter field, returns a subset somehow?? 
2591 
>>> len(sqs.filter(has_been_sent='t')) 
3621 
>>> len(sqs.filter(has_been_sent='f')) 
2812 

Потому что я получаю подмножество при фильтрации на поддельной поле, я не думаю, что это признание has_been_sent как один из моих полей фильтра. Тем более, что результаты для 't' и 'f' не суммируются с суммой, которую она ДОЛЖНА, так как это булевское поле требуется для всех записей. Я пропустил шаг в своем тестировании?

ответ

1

Похоже, что проблема была в простом бэкэнде. Я установил и переключил Haystack на Whoosh, и эта проблема прояснилась. (Now SearchQuerySet() не работает, но это, видимо, документированная ошибка с Haystack + Whoosh.)

Редактировать: Из-за дальнейших проблем с Whoosh я переключился на использование Solr 4.5.1 в качестве моего бэкэнд , Сейчас все работает так, как ожидалось.

6

Попытка фильтровать как строку true или false в запросе, это было известное ограничение в стоге сена, и я не уверен, если это фиксируется, а не делать:

sqs.filter(has_been_sent=True) 

ли это:

sqs.filter(has_been_sent='true') # true or false in lowercase 

PS когда вы делаете SearchQuerySet().filter() вы фильтр на основе полей, определенных в файле search_indexes.py.

+0

Хм. Я все равно получаю пустой результат с «true» и «false». Я думаю, что я должен тестировать оболочку manage.py неправильно. Я редактировал свой основной пост, чтобы показать, как я тестирую. Кажется, я, наверное, пропустил шаг. – Goluxas

+0

Я предлагаю вам добавить значение по умолчанию для логического поля как в модели, так и в файле 'search_indexes.py', а затем выполнить команды для rebuild_index и update_index с уважением и снова проверить, как я предложил. –

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