尝试通过布尔值过滤SearchQuerySet对我来说不起作用。 (我在测试时使用提供的“简单”后端搜索引擎。)
我的索引如下:
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结果,这显然是错误的。我也试过shell,没有运气。 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'的结果不等于总数,它应该是,因为所有记录都需要布尔字段。我在测试中错过了一步吗?
答案 0 :(得分:6)
尝试在查询中过滤为字符串true
或false
,这是haystack中的已知限制,我不确定这是否已修复,而不是:
sqs.filter(has_been_sent=True)
这样做:
sqs.filter(has_been_sent='true') # true or false in lowercase
当您执行SearchQuerySet().filter()
时,根据search_indexes.py
文件中定义的字段进行过滤。
答案 1 :(得分:1)
问题出现在Simple后端。我安装并将Haystack切换到Whoosh,这个问题就解决了。 (现在SearchQuerySet()。models()不起作用,但这显然是Haystack + Whoosh的文档错误。)
编辑:由于Whoosh的进一步麻烦,我转而使用Solr 4.5.1作为我的后端。现在一切都按预期工作了。