3

Я пытаюсь использовать django-haystack + whoosh в своем приложении Django. Мой класс индекса выглядит как этотКак фильтровать результаты с помощью django-haystack SearchQuerySet?

class ArticleIndex(indexes.SearchIndex, indexes.Indexable): 

text = indexes.CharField(document=True, use_template=True) 

title = indexes.CharField(model_attr='title') 

abstract = indexes.CharField(model_attr='abstract') 

def get_model(self): 
    return Article 

def index_queryset(self, using=None): 
    return self.get_model().objects.all() 

и моя модель выглядит следующим образом:

class Article(models.Model): 
title = models.CharField(max_length=100) 
authors = models.ManyToManyField(User) 
abstract = models.CharField(max_length=500, blank=True) 
full_text = models.TextField(blank=True) 
proquest_link = models.CharField(max_length=200, blank=True, null=True) 
ebsco_link = models.CharField(max_length=200, blank=True, null=True) 

def __unicode__(self): 
    return self.title 

В моем шаблоне я использую поле поиска Ajax для запроса Статьи моделей и возвращать результаты в такой же страница. По сути, ajax запускает запрос HttpPost, содержащий текст поиска для представления. В представлении я хочу получить весь объект статьи, чье абстрактное поле содержит текст поиска, отправленный через HttpPost. На мой взгляд, я получаю текст поиска, а затем пытаюсь получить модели, такие как

search_text = request.POST['search_text'] 
articles = SearchQuerySet().filter(abstract=search_text) 

но не возвращает никаких результатов. Если я позвоню

articles = SearchQuerySet().all() 

он вернет 12 объектов модели в локальную тестовую БД. Однако функция фильтра не возвращает никаких результатов. Что я хочу сделать, это эквивалент

articles= Article.objects.filter(abstract__contains=search_text) 

Любые предложения? Спасибо

+0

Вы помните, что после изменения в «ArticleIndex» вы забыли вызвать «manage.py update_index»? – maciek

+0

Не могу поверить, что я это помню, но да! – AndrewSmiley

ответ

3

После некоторого копания, я обновил свой указательный класс выглядеть следующим образом:

class ArticleIndex(indexes.SearchIndex, indexes.Indexable): 
    text = indexes.NgramField(document=True, use_template=True) 
    title = indexes.NgramField(model_attr='title') 

    abstract = indexes.NgramField(model_attr='abstract') 

    def get_model(self): 
     return Article 

    def index_queryset(self, using=None): 
     return self.get_model().objects.all() 

Там что-то с помощью .filter() атрибутов типа indexes.CharField в Джанго стоге сена 2.1.0 , Может быть, кто-то может предоставить более подробную информацию, но это то, что работает для меня.

Смежные вопросы