Как искать по целому полю в виде строки (например, «приоритет») с django-haystack? - PullRequest
3 голосов
/ 27 февраля 2012

У меня есть модель Ticket, которую я пытаюсь найти по атрибуту приоритета IntegerField в виде строки. Я могу получить haystack + solr для поиска по целочисленному значению, но не в виде строки.

Я думал, что вы могли бы сделать это с функцией prepare_priority в классе индекса поиска, но мне не повезло. Вот мой search_index.py:

from haystack import indexes
from helpdesk.models import Ticket

class TicketIndex(indexes.SearchIndex, indexes.Indexable):
    text = indexes.CharField(document=True, use_template=True)
    title = indexes.CharField(model_attr='title')
    priority = indexes.CharField(model_attr='priority')

    def prepare_priority(self, obj):
        priorities = {1:'critical', 2:'high', 3:'normal', 4:'low'}
        return priorities[obj.priority]

    def get_model(self):
        return Ticket

    def index_queryset(self):
        """Used when the entire index for model is updated."""
        return self.get_model().objects.all()

Вот мой шаблон ticket_text.txt:

{{ object.title }}
{{ object.priority }}
{{ object.body }}

Я что-то неправильно понимаю или делаю что-то не так?

Спасибо.

1 Ответ

1 голос
/ 24 июня 2012

Почему prepare_priority() "не работает"

A SearchIndex используется для преобразования отдельных объектов данной модели в записи в индексе Whoosh.Я назову эти записи SearchResults, так как они отображаются в оболочке.Теперь поля, которые вы определили в TicketIndex, (конечно) присутствуют в SearchResults для Tickets:

>>> from haystack.query import SearchQuerySet
>>> q = SearchQuerySet()
>>> ticket0 = q.all()[0]
>>> type(ticket0)
<class 'haystack.models.SearchResult'>
>>> hasattr(ticket0, 'text') and hasattr(ticket0, 'title') and hasattr(ticket0, 'priority')
True

Это означает, что 'priority' отображается дважды - один раз как независимыйполе и один раз как часть содержимого 'text'.Независимое поле выполняет через процедуру prepare_X.Текстовое поле проходит через шаблон (где object относится к исходному объекту модели, не словарь подготовленных данных).

>>> print ticket0.priority
critical
>>> print ticket0.text
OH NOES!!!!
1
There's a problem. Very problematic. Please fix at once.

Исправление

В моделях:

PRIORITIES = {1:'critical', 2:'high', 3:'normal', 4:'low'}
class Ticket(models.Model):
  ...
  priority = models.IntegerField(choices=PRIORITIES.items())

Используйте автоматически предоставленные get_priority_display в качестве model_attr:

class TicketIndex(indexes.SearchIndex):
  ...
  priority = indexes.CharField(model_attr='get_priority_display')

Используйте get_priority_display в шаблоне:

{{ object.get_priority_display }}
...