Фильтровать результаты Django Haystack как QuerySet? - PullRequest
10 голосов
/ 29 января 2010

Возможно ли объединить поиск в стоге сена Django со "встроенными" операциями фильтра QuerySet, в частности фильтрацией с использованием экземпляров Q () и типов поиска, не поддерживаемых SearchQuerySet? В любом порядке:

haystack-searched -> queryset-filtered

или

queryset-filtered -> haystack-searched

Просмотр документации по стогу сена Django не дал никаких указаний, как это сделать.

Ответы [ 3 ]

10 голосов
/ 14 июня 2010

Вы можете отфильтровать ваш набор запросов по результатам поиска в стоге сена, используя PK объектов:

def view(request):
  if request.GET.get('q'):
    from haystack import ModelSearchForm
    form = ModelSearchForm(request.GET, searchqueryset=None, load_all=True)
    searchqueryset = form.search()
    results = [ r.pk for r in searchqueryset ]

    docs = Document.objects.filter(pk__in=results)
    # do something with your plain old regular queryset

    return render_to_response('results.html', {'documents': docs});

Не уверен, как это масштабируется, но для небольших наборов результатов (несколько сотен, в моем случае) это работает нормально.

1 голос
/ 19 июня 2014

Из документов:

SearchQuerySet.load_all (само)

Эффективно заполняет объекты в результатах поиска. Без использования В этом методе поиск БД выполняется для каждого объекта, что приводит к много индивидуальных поездок в базу данных. Если используется load_all, SearchQuerySet сгруппирует похожие объекты в один запрос, в результате только столько запросов, сколько существует различных типов объектов вернулся.

http://django -haystack.readthedocs.org / о / последний / searchqueryset_api.html # нагрузки все

Поэтому, после того как у вас есть отфильтрованный SQS, вы можете выполнить load_all () для него и просто получить доступ к объектам базы данных через SearchResult.object. Например.

sqs = SearchQuerySet()
# filter as needed, then load_all
sqs = sqs.load_all()

for result in sqs:
    my_obj = result.object
    # my_obj is a your model object
0 голосов
/ 15 июля 2011

Если вы хотите идти в ногу с уместностью, вам нужно получить доступ к объекту из базы данных через «объект»:

пример в вашем шаблоне:

{% for result in results %}
    {{ result.object.title }}
    {{ result.objects.author }}
{% endfor %}

Но это действительно плохо, так как стог сена будет делать дополнительный запрос типа «SELECT * FROM blah WHERE id = 42» для каждого результата.

Кажется, вы пытаетесь получить эти объекты из своей базы данных, потому что вы не добавили в индекс несколько дополнительных полей, не так ли? Если вы добавите заголовок И автора в свой SearchIndex, то вы можете просто использовать свои результаты:

{% for result in results %}
    {{ result.title }}
    {{ result.author }}
{% endfor %}

и избегайте лишних запросов.

...