Django-Haystack: подготовка данных индекса с возможностью выбора

Добрый день,

Скажем, у меня есть models.py вот так:

class my_stackoverflow_question(models.Model):
    feedback_choices = (
        (GREAT, "Was a great question"),
        (MEH, "Could've figured it out"),
        (TERRIBLE, "I pity the foo"),
    )

    feedback = models.IntegerField(default=GREAT, choices=feedback_choices)

Мой search_indexes.py такой:

class question_index(indexes.SearchIndex, indexes.Indexable):
    text = ...stuff...
    feedback = indexes.IntegerField(model_attr='feedback', faceted=True)

Когда я показываю вышеуказанный аспект, целочисленное значение будет отображаться в шаблоне.

{% for feed in facets.fields.feedback %}
    {{feed.0}} - {{feed.1}}
{% endfor %}

# Shows: 0-999
#        1-1
#        2-0 ;)

Я бы хотел, чтобы feed.0 отображал фактическое значение выбора, например obj.get_feedback_display(). Поэтому я подумал, что попробую подготовить данные перед индексацией:

def prepare_feedback(self, obj):
    return obj.feedback.get_feedback_display()  #'AttributeError: 'long' object has no attribute 'get_feedback_display''

или вернуть "%s" % (obj.feedback.get_feedback_display()) # Та же ошибка, что и выше

Я был бы даже в порядке, если бы данные были проиндексированы как целое число, а затем фасет feed.0 отображал имя, но я считаю, что поля фасета поступают прямо из индекса, а не из модели (это правильно?)

Как я могу отобразить display_name фасета, а не его исходное значение?

Спасибо!


person ZAR    schedule 27.03.2014    source источник


Ответы (1)


Я думаю, что вы на правильном пути с индексацией отображаемого текста вместо целочисленного значения выбора. Вам нужно сообщить haystack, что он должен ожидать строку вместо long для обратной связи, а затем вызвать get_feedback_display() для самого объекта my_stackoverflow_question, а не для поля обратной связи.

So:

class question_index(indexes.SearchIndex, indexes.Indexable):
    text = ...stuff...
    feedback = indexes.CharField(model_attr='feedback', faceted=True)

    def prepare_feedback(self, obj):
        return obj.get_feedback_display()
person Sohan Jain    schedule 27.03.2014