gpt4 book ai didi

python - Django Haystack - 如何通过 bool 字段过滤搜索结果?

转载 作者:太空狗 更新时间:2023-10-29 22:30:50 26 4
gpt4 key购买 nike

尝试按 bool 值过滤 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,因为我使用 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

因为我在过滤假字段时得到了一个子集,所以我认为它不会将 has_been_sent 识别为我的过滤字段之一。特别是因为 't' 和 'f' 的结果加起来不等于总数,它应该,因为所有记录都需要该 bool 字段。我是否遗漏了测试步骤?

最佳答案

尝试在查询中过滤为字符串 truefalse,这是 haystack 中已知的限制,我不确定这是否已修复,而不是做:

sqs.filter(has_been_sent=True)

这样做:

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

请注意,当您执行 SearchQuerySet().filter() 时,您会根据 search_indexes.py 文件中定义的字段进行过滤。

关于python - Django Haystack - 如何通过 bool 字段过滤搜索结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19234416/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com