我使用Django 1.5.1和django-haystack 2.1.0以及飞快移动的2.5.2后端:
models.py:
GENDER_CHOICES = (
(u'M', u'Male'),
(u'F', u'Female'),
)
class Applicant(models.Model):
gender = models.CharField(max_length=1, choices=GENDER_CHOICES)
first_name = models.CharField(max_length=64)
last_name = models.CharField(max_length=64)
search_indexes.py:
class ApplicantIndex(indexes.SearchIndex, indexes.Indexable):
text = indexes.CharField(document=True,use_template=True)
gender = indexes.CharField(model_attr="gender")
搜索模板
{{ object.first_name }}
{{ object.last_name }}
在django shell中我试着跟随:
>>> from haystack.query import SearchQuerySet
>>> sqs=SearchQuerySet()
>>> sqs
[<SearchResult: tooldb.applicant (pk=u'1')>, <SearchResult: tooldb.applicant (pk=u'2')>]
>>> sqs[0].gender
u'M' #<-- So this seems to be indexed
#but when i try:
>>> sqs.filter(gender='M')
[] #<-- I get nothing ... ?
我尝试了其他没有选择的CharFields和max_lenght&gt; 1,完全没问题,像它一样的干草堆过滤器。
我错过了什么?
答案 0 :(得分:2)
好吧,我想我明白了......
似乎haystack与whoosh结合使用单个字符查询根本不用。
这有点令人讨厌,因为SearchQuerySet应该以Django的QuerySet的工作方式实现。 (https://django-haystack.readthedocs.org/en/v2.1.0/searchqueryset_api.html#why-follow-queryset)
QuerySet的filter方法适用于一个字符作为查询,SearchQuerySet只返回任何内容。
这应该在某处记录......
答案 1 :(得分:2)
这是我的解决方案:
class ApplicantIndex(indexes.SearchIndex, indexes.Indexable):
text = indexes.CharField(document=True, use_template=True)
gender = indexes.CharField()
def prepare_gender(self, obj):
return obj.gender*3
现在你可以过滤:
sqs.filter(gender='MMM')