Подтвердить что ты не робот

Haystack говорит: "Модель не найдена для SearchResult"

После обновления моего Django с 1.7 до 1.9 поисковая система, основанная на Haystack и Solr, перестала работать. Это то, что я получаю:

./manage.py shell
Python 2.7.6 (default, Jun 22 2015, 17:58:13)
[GCC 4.8.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> from haystack.query import SearchQuerySet
>>> sqs = SearchQuerySet().all()
>>>sqs[0].pk
u'1'
>>> sqs[0].text
u'\u06a9\u0627\u0645\u0631\u0627\u0646 \u0647\u0645\u062a\u200c\u067e\u0648\u0631 \u0648 \u0641\u0631\u0647\u0627\u062f \u0628\u0627\u062f\u067e\u0627\nKamran Hematpour & Farhad Badpa'
>>> sqs[0].model_name
u'artist'
>>> sqs[0].id
u'mediainfo.artist.1'
>>> sqs[0].object
Model could not be found for SearchResult '<SearchResult: mediainfo.artist (pk=u'1')>'.

Я должен сказать, что моя база данных не является empy, и моя конфигурация такова:

HAYSTACK_CONNECTIONS ={
    'default': {
        'ENGINE': 'haystack.backends.solr_backend.SolrEngine',
        'URL': 'http://ahangsolr:8983/solr',
    },
}

И это мой search_indexes.py:

import datetime
from haystack import indexes
from mediainfo.models import Album
from mediainfo.models import Artist
from mediainfo.models import PlayList
from mediainfo.models import Track
from mediainfo.models import Lyric

class AlbumIndex(indexes.SearchIndex, indexes.Indexable):
    text = indexes.CharField(document=True, use_template=True)
    artist = indexes.CharField(model_attr='artist', indexed=True)
    publish_date = indexes.DateTimeField(model_attr='publish_date')

    def get_model(self):
        return Album

    def index_queryset(self, using=None):
        """Used when the entire index for model is updated."""
        return self.get_model().objects.filter(publish_date__lte=datetime.datetime.now())


class ArtistIndex(indexes.SearchIndex, indexes.Indexable):
    text = indexes.CharField(document=True, use_template=True)

    def get_model(self):
        return Artist


class PlaylistIndex(indexes.SearchIndex, indexes.Indexable):
    text = indexes.CharField(document=True, use_template=True)

    def get_model(self):
        return PlayList


class TrackIndex(indexes.SearchIndex, indexes.Indexable):
    text = indexes.CharField(document=True, use_template=True)

    def get_model(self):
        return Track


class LyricIndex(indexes.SearchIndex, indexes.Indexable):
    text = indexes.CharField(document=True, use_template=True)

    def get_model(self):
        return Lyric
4b9b3361

Ответ 1

Мне удалось исправить эту проблему, включив недостающую фиксацию в версию 2.4.1. Конец, который исправил эту проблему, был https://github.com/django-haystack/django-haystack/commit/f1ed18313777005dd77ed724ecbfb27c0b03cad8

чтобы вы могли сделать

pip install git+ssh://[email protected]/django-haystack/[email protected]

для установки до указанного конкретного коммита.

Ответ 2

Было бы неплохо начать проверку реестра приложений, чтобы убедиться, что он может найти вашу модель (просто убедитесь).

from django.apps import apps as django_apps
model = django_apps.get_model('mediainfo.artist')
model.app_label, model.model_name
assert model._meta.app_label == 'mediainfo'
assert model._meta.model_name == 'artist'

Затем я бы проверил, что возвращает haystack.

from haystack.utils.app_loading import haystack_get_model
haystack_model = haystack_get_model('mediainfo', 'artist')
haystack_model == model

Если это не возвращает то же самое (haystack_model!= model); то вам нужно будет копать дальше.

Тем не менее, модели загрузки и поиска изменились между django 1.7.0 и 1.8.0 (устаревание), а django.db.models.loading.get_model было удалено в 1.8.2. Подробности django-haystack # 1206.

Следовательно, для django-haystack для работы с django 1.9.0 вам нужен релиз, который включает this commit; то есть django-haystack>=2.4.0.