Django Haystack огранка по типу модели - PullRequest
5 голосов
/ 25 июля 2011

Я хочу получить результаты, основанные на различных возвращенных именах (классах) модели.Есть ли простой способ сделать это?

Ответы [ 3 ]

5 голосов
/ 18 октября 2012

Вы пытались добавить поле SearchIndex с этой информацией? Э.Г.

class NoteIndex(SearchIndex, indexes.Indexable):
    title = CharField(model_attr='title')
    facet_model_name = CharField(faceted=True)

    def get_model(self):
        return Note

    def prepare_facet_model_name(self, obj):
        return "note"


class MemoIndex(SearchIndex, indexes.Indexable):
    title = CharField(model_attr='title')
    facet_model_name = CharField(faceted=True)

    def get_model(self):
        return Memo

    def prepare_facet_model_name(self, obj):
        return "memo"

И так далее, просто возвращая разные строки для каждого поискового индекса. Вы также можете создать миксин и вернуть название модели, возвращенное get_model.

Предполагая, что вы добавили это поле в каждое из ваших SearchIndex определений, просто связывайте facet метод с вашими результатами.

results = form.search().facet('facet_model_name')

Теперь метод facet_counts будет возвращать словарь с гранеными полями и количеством результатов для каждого значения фасета, в данном случае имен моделей.

Обратите внимание, что поле здесь помечено многословно, чтобы избежать возможного конфликта с model_name, полем, добавленным Haystack. Он не граненый, и я не уверен, что его дублирование вызовет конфликт.

0 голосов
/ 22 мая 2017

Если вы просто хотите фильтровать по типу модели, вы можете использовать ModelSearchForm

0 голосов
/ 15 октября 2015

Документы имеют действительно хороший проход для этого.

Минимум, который вам понадобится:

  1. - это добавление faceted=True кпараметры вашего model_names поля.
  2. Перестройте вашу схему и индексы.
  3. добавьте .facet('model_names') к любому SearchQuerySet, который вы хотите получить.

Более подробное объяснение вопроса позволит получить более полный ответ.

...