2013-10-07 124 views
6

試圖通過布爾值過濾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'的結果不加起來,它應該如此,因爲所有記錄都需要布爾字段。我在測試中錯過了一步嗎?

回答

1

看來問題出在簡單的後端。我安裝並將Haystack轉換到了Whoosh,並解決了這個問題。 (NowQueryQuerySet()。models()不起作用,但這顯然是Haystack + Whoosh的一個記錄錯誤。)

編輯:由於進一步的問題與轉換,我切換到使用Solr 4.5.1作爲我的後端。一切都如預期般運作。

6

試圖篩選作爲查詢字符串truefalse,這一直是大海撈針已知的限制,我不知道這是固定的,而不是做:

sqs.filter(has_been_sent=True) 

這樣做:

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

PS當你做SearchQuerySet().filter()你根據在search_indexes.py文件中定義的字段進行過濾。

+0

嗯。 「真」和「假」我仍然得到一個空的結果。我想我必須通過manage.py shell進行錯誤的測試。我編輯了我的主要帖子,以顯示我如何測試。我想我一定錯過了一步。 – Goluxas

+0

我建議你在模型或'search_indexes.py'文件中爲布爾字段添加默認值,然後分別運行命令rebuild_index和update_index,然後再次按照我的建議進行測試。 –

相關問題