Индексные объекты Haystack, используя их обратную связь

У меня есть две модели:

class Question(models.Model):
    question_text = models.TextField()

class Response(models.Model):
    response_text = models.TextField()
    question = models.ForeignKey(Question, related_name='responses', on_delete=models.CASCADE)

У меня есть один индекс поиска стога сена, чтобы проиндексировать все Question"s question_text:

class QuestionIndex(indexes.SearchIndex, indexes.Indexable):
    text = indexes.CharField(document=True, use_template=True)
    question_text = indexes.CharField(model_attr='question_text')
    def get_model(self):
        return Question

Как мне проиндексировать все response_text так что когда я ищу Questions, я получаю все вопросы, которые соответствуют question_text и все вопросы, ответы на которые совпадают response_text? Я хочу что-то вроде:

class QuestionIndex(indexes.SearchIndex, indexes.Indexable):
    text = indexes.CharField(document=True, use_template=True)
    question_text = indexes.CharField(model_attr='question_text')
    response_text = indexes.CharField(model_attr='responses__response_text')
    def get_model(self):
        return Question

Главный вопрос: как мне проиндексировать все response_text используя это QuestionIndex учебный класс?

1 ответ

Вы можете поставить prepare_ метод для этого поля, чтобы указать, какие данные индексируются:

class QuestionIndex(indexes.SearchIndex, indexes.Indexable):
    text = indexes.CharField(document=True, use_template=True)
    question_text = indexes.CharField(model_attr='question_text')
    response_text = indexes.CharField()

    def prepare_response_text(self, obj):
        return ', '.join([r.response_text for r in obj.responses.all()])
Другие вопросы по тегам