Django干草堆,带嗖嗖声-罐头';布尔域t滤波器

Django干草堆,带嗖嗖声-罐头';布尔域t滤波器,django,django-haystack,whoosh,Django,Django Haystack,Whoosh,好吧,我已经为这件事焦头烂额好几个小时了,我想是时候寻求帮助了,因为我无法通过谷歌搜索找到这件事发生的原因 本质上,我正在制作一个分类广告类型的应用程序,我需要一个搜索表单来搜索数据库,并根据各种条件进行筛选。我正在使用django、haystack和whoosh,我已经让它几乎完美地工作了,但我似乎无法让它对布尔变量进行过滤。我已经成功地在Charfield类别上进行了过滤,效果非常好,但当我尝试添加基于待售布尔值(或任何布尔值)的过滤器时,它不会过滤任何内容,并返回与从未调用过的结果相同的结

好吧,我已经为这件事焦头烂额好几个小时了,我想是时候寻求帮助了,因为我无法通过谷歌搜索找到这件事发生的原因

本质上,我正在制作一个分类广告类型的应用程序,我需要一个搜索表单来搜索数据库,并根据各种条件进行筛选。我正在使用django、haystack和whoosh,我已经让它几乎完美地工作了,但我似乎无法让它对布尔变量进行过滤。我已经成功地在Charfield类别上进行了过滤,效果非常好,但当我尝试添加基于待售布尔值(或任何布尔值)的过滤器时,它不会过滤任何内容,并返回与从未调用过的结果相同的结果(我已经检查过,它实际上正在被调用)

有人有什么想法吗

我的模型的相关部分:

class Listing(models.Model):
    SALE_CHOICES=((True, 'Items for sale'),
          (False, 'Items wanted'))
    for_sale = models.BooleanField(choices=SALE_CHOICES, default=True)
    CAT_CHOICES = ((WOOD, "Woods"), (BRICKS, "Bricks"), etc)
    category = models.CharField(max_length=6, choices = CAT_CHOICES, default = WOOD)
这是我的列表索引类:

class ListingIndex(indexes.SearchIndex, indexes.Indexable):
    text = indexes.CharField(document=True, use_template=True)
    title = indexes.CharField(model_attr='title')
    text_content = indexes.CharField(model_attr='text_content')
    created = indexes.DateTimeField(model_attr='created')
    url = indexes.CharField(model_attr='url')
    price = indexes.CharField(model_attr='price', null=True)
    city = indexes.CharField(model_attr='city', null=True)
    category = indexes.CharField(model_attr='category')
    for_sale = indexes.BooleanField(model_attr='for_sale', default=True)

def get_model(self):
    return Listing

def index_queryset(self, using=None):
    return self.get_model().objects.filter(expired=False).filter(verified=True)   
我的扩展SearchForm和SearchView:

class ListingSearchForm(FacetedSearchForm):
    cat = forms.CharField(required=False, widget=forms.Select(choices=get_listings_categories()))
    type = forms.CharField(required=False, widget=forms.HiddenInput)
    for_sale = forms.BooleanField(required=False, widget=forms.Select(choices=get_sale_categories()))

def search(self):
    # First, store the SearchQuerySet received from other processing.
    sqs = super(ListingSearchForm, self).search()

    # Check to see if a category was chosen.
    if self.cleaned_data['cat']:
        sqs = sqs.filter(category=self.cleaned_data['cat'])

    # Check to see if a type was chosen.
    if self.cleaned_data['for_sale']:
        sqs = sqs.filter(for_sale=self.cleaned_data['for_sale'])

    return sqs


class ListingSearchView(SearchView):

    def extra_context(self):
        extra = super(ListingSearchView, self).extra_context()

        extra['post_type'] = self.request.GET.get('type', None)
        extra['cat'] = self.request.GET.get('cat', None)
        extra['for_sale'] = self.request.GET.get('for_sale', None)

        return extra
最后是我的列表索引文本文件:

{{ object.title }}
{{ object.text_content }}
{{ object.created }}
{{ object.url }}
{{ object.category }}
{{ object.price }}
{{ object.city }}
{{ object.for_sale }}

最后我把我的待售字段改成了CharField,现在我可以很好地过滤它了


Haystack或Whoosh就是不喜欢布尔人,我想哈哈。

我最后把我的待售领域改成了CharField,现在我可以很好地过滤它了

Haystack或Whoosh不喜欢布尔人,我想哈哈。

可能与:

我注意到whoosh将boolean存储为Python值True和False,而haystack存储的字符串“True”和“False”在查询时都作为True进行计算

此外,查询我的索引需要为布尔字段使用字符串“t”和“f”。使用此修补程序可以查询True或False

这显然是在2.4x分支(在2.41发布之后,所以还不可用)和2.5.0及更高版本中。它可能与:

我注意到whoosh将boolean存储为Python值True和False,而haystack存储的字符串“True”和“False”在查询时都作为True进行计算

此外,查询我的索引需要为布尔字段使用字符串“t”和“f”。使用此修补程序可以查询True或False


很明显,在2.4x分支(2.41发布后,目前还不可用)和2.5.0及更高版本中。

django haystack有两个版本,1.x和2.x,人们(至少我)在生产中成功地使用了haystack 2.x。你用的是什么版本?我用的是haystack 1.x。最后我把我的待售字段改成了CharField,现在我可以很好地过滤它了。Haystack或Whoosh只是不喜欢booleans,我想哈哈。django Haystack有两个版本,1.x和2.x,人们(至少我)在生产中成功地使用了Haystack 2.x。你用的是什么版本?我用的是haystack 1.x。最后我把我的待售字段改成了CharField,现在我可以很好地过滤它了。Haystack或Whoosh就是不喜欢布尔人,我猜哈哈。