Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/300.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django Haystack-如何通过布尔字段过滤搜索结果?_Python_Django_Django Haystack - Fatal编程技术网

Python Django Haystack-如何通过布尔字段过滤搜索结果?

Python Django Haystack-如何通过布尔字段过滤搜索结果?,python,django,django-haystack,Python,Django,Django Haystack,尝试用布尔值筛选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')

尝试用布尔值筛选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个结果,这显然是错误的。我也试过贝壳,运气不好
sqs.filter(has\u sent=True)
sqs.filter(has\u sent=False)
都返回一个空列表,即使
sqs.values('has\u sent')
清楚地显示了一组has\u sent具有真值的记录。更奇怪的是,
sqs.filter(haves_sent='t')
返回记录的子集,以及“f”、“a”和不相关的字母,如“j”!我完全不知所措。有人有过干草堆这种问题的经验吗

请注意,您通过
SearchQuerySet().filter()
从索引字段(在search_index.py中)或模型字段(在各自的models.py中)筛选的字段是否相关

编辑:

我一直试图通过Django的manage.py shell测试我的过滤器,但我认为我做得不对。它似乎没有遵循我的search_indexes.py,因为我使用那里的index_queryset()方法将它限制为MyModel的一个子集,但我在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

因为我在对假字段进行筛选时得到了一个子集,所以我认为它不会识别是否已作为我的筛选字段之一发送。特别是因为't'和'f'的结果加起来不等于总数,这是应该的,因为所有记录都需要该布尔字段。我在测试中是否遗漏了一个步骤?

尝试在查询中过滤为字符串
true
false
,这是haystack中已知的限制,我不确定这是否已修复,而不是执行以下操作:

sqs.filter(has_been_sent=True)
这样做:

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

p.S当您执行
SearchQuerySet().filter()
时,您将根据
search\u index.py
文件中定义的字段进行筛选。

问题似乎出在简单的后端。我安装了Haystack并把它换成了Whoosh,这个问题就解决了。(现在SearchQuerySet().models()不起作用,但这显然是Haystack+Whoosh中记录的一个bug。)


编辑:由于Whoosh的进一步问题,我转而使用Solr4.5.1作为后端。现在一切正常。

嗯。我仍然得到一个空的结果,带有“真”和“假”。我想我一定是通过manage.py shell测试错了。我编辑了我的主要帖子来展示我是如何测试的。我想我一定错过了一个步骤。我建议您在模型或
search\u indexes.py
文件中为布尔字段添加一个默认值,然后分别运行命令重建和更新索引,并按照我的建议再次测试。