Django-haystack со свистом - нельзя фильтровать по логическому полю

Ну, я уже много часов выдергивал волосы из-за этого и решил, что пора обратиться за помощью, так как я не могу понять, почему это происходит, с помощью поиска в Google ...

По сути, я делаю приложение типа объявлений, и мне нужна форма поиска для поиска в базе данных и фильтрации по различным критериям. Я использую 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 и 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 }}

person user2184916    schedule 22.03.2013    source источник
comment
Есть две версии django-haystack, 1.x и 2.x, люди (ну, по крайней мере, я) успешно используют haystack 2.x в производстве. Какую версию ты используешь?   -  person n3storm    schedule 22.03.2013
comment
Я использую haystack 1.x. В итоге я переработал свое поле for_sale как CharField, и теперь я могу его фильтровать. Haystack или Whoosh просто не любят логические значения, я думаю, ха-ха.   -  person user2184916    schedule 22.03.2013


Ответы (2)


В итоге я переработал свое поле for_sale как CharField, и теперь я могу его фильтровать.

Haystack или Whoosh просто не любят логические значения, я думаю, ха-ха.

person user2184916    schedule 22.03.2013

Вероятно, это то же самое, что и № 371 в Haystack:

Я заметил, что whoosh хранит логические значения в качестве значений Python True и False, в стоге сена, напротив, хранятся строки «true» и «false», которые при запросе оцениваются как True.

Кроме того, при запросе моего индекса требовалось использовать строки «t» и «f» для логических полей. С помощью этого патча можно запросить True или False.

Что, по-видимому, было исправлено в Whoosh в ветке 2.4x (после выпуска 2.41, так что пока недоступно) и 2.5.0 и новее.

person qris    schedule 04.10.2013