試圖通過布爾值過濾SearchQuerySet對我無效。 (我用的是提供「簡單」的後臺搜索引擎,而測試。)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選項設置爲Yes或No,我總是得到0個結果,這顯然是錯誤的。我也嘗試了殼,沒有運氣。 sqs.filter(has_been_sent=True)
和sqs.filter(has_been_sent=False)
都返回一個空列表,即使如此sqs.values('has_been_sent')
清楚地顯示has_been_sent True值的一堆記錄。更奇怪的是,sqs.filter(has_been_sent='t')
返回記錄的子集,以及'f','a'和無關字母'j'!我處於全面虧損狀態。 Haystack有沒有人遇到過這種問題?
在相關說明上,是您通過SearchQuerySet().filter()
從索引字段(在search_indexes.py中)或模型字段(在各自的models.py中)過濾的字段?
編輯:
我一直在試圖通過Django的manage.py shell來測試我的過濾器,但我覺得我做錯了。它似乎沒有跟隨我的search_indexes.py,因爲我將它限制在MyModel的一個子集中,並使用了index_queryset()方法,但是我在shell中獲得了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'的結果不加起來,它應該如此,因爲所有記錄都需要布爾字段。我在測試中錯過了一步嗎?
嗯。 「真」和「假」我仍然得到一個空的結果。我想我必須通過manage.py shell進行錯誤的測試。我編輯了我的主要帖子,以顯示我如何測試。我想我一定錯過了一步。 – Goluxas
我建議你在模型或'search_indexes.py'文件中爲布爾字段添加默認值,然後分別運行命令rebuild_index和update_index,然後再次按照我的建議進行測試。 –