2013-03-22 46 views
1

嗯,我已经把我的头发拉出了这个好几个小时,现在想通过寻求帮助的时候了,因为我无法找出原因这是通过谷歌搜索...django-haystack with whoosh - 无法通过布尔字段进行过滤

本质上,我正在做一个分类类型的应用程序,我需要一个搜索表单来搜索数据库和筛选基于各种标准。我使用django,haystack和whoosh,并且我几乎可以正常工作,但似乎无法使用布尔变量进行过滤。我已经成功地过滤了Charfield类别,它完美地工作,但是当我尝试添加基于for_sale布尔值(或任何布尔值)的过滤器时,它不会过滤任何内容并返回相同的结果,如果它从来没有被称为(我已经检查过,它实际上被称为)。

任何人有任何想法?

我的模型的相关部分:

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和搜索查看:

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 }} 
+0

django-haystack有两个版本,1.x和2.x,人们(至少我是)在生产中成功使用haystack 2.x。你使用什么版本? – n3storm

+0

我正在使用haystack 1.x. 我结束了重新工作我的for_sale字段作为CharField,现在我能够过滤罚款。 干草堆或飞快移动只是不喜欢布尔人我猜哈哈。 – user2184916

回答

1

我结束了重新工作我的for_sale字段作为CharField,现在我能够过滤罚款。

干草堆或飞快移动只是不喜欢布尔值我猜哈哈。

0

它可能是一样的issue #371 in Haystack

我注意到,嗖存储布尔值作为Python的值真假,草垛相比之下存储字符串“真”与“假”,无论是评估是否为真查询。

另外查询我的索引需要使用字符串't'和'f'作为布尔字段。有了这个补丁,可以用True或False查询。

其中明显是fixed in Whoosh,在2.4x分支(在2.41发布后,所以还没有可用)和2.5.0及更高版本。

相关问题