Попытка фильтровать 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' не суммируются с суммой, которую она ДОЛЖНА, так как это булевское поле требуется для всех записей. Я пропустил шаг в своем тестировании?
Хм. Я все равно получаю пустой результат с «true» и «false». Я думаю, что я должен тестировать оболочку manage.py неправильно. Я редактировал свой основной пост, чтобы показать, как я тестирую. Кажется, я, наверное, пропустил шаг. – Goluxas
Я предлагаю вам добавить значение по умолчанию для логического поля как в модели, так и в файле 'search_indexes.py', а затем выполнить команды для rebuild_index и update_index с уважением и снова проверить, как я предложил. –