After updating my Django from 1.7 to 1.9, search engine, which is based on Haystack and Solr, stopped working. This is what I get:
./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')>'.
I have to say my database is not empy and my configuration is as follow:
HAYSTACK_CONNECTIONS ={
'default': {
'ENGINE': 'haystack.backends.solr_backend.SolrEngine',
'URL': 'http://ahangsolr:8983/solr',
},
}
And this is my 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
I was able to fix the issue by including a missing commit to the 2.4.1 release. The commit that fixed this issue was https://github.com/django-haystack/django-haystack/commit/f1ed18313777005dd77ed724ecbfb27c0b03cad8
so you can do
pip install git+ssh://[email protected]/django-haystack/django-haystack.git@f1ed18313777005dd77ed724ecbfb27c0b03cad8
to install until that specific commit.
It would be good to start checking the app registry to make sure it can find your model (just to be sure).
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'
Then I would check what haystack
is returning.
from haystack.utils.app_loading import haystack_get_model
haystack_model = haystack_get_model('mediainfo', 'artist')
haystack_model == model
If that doesn't return the same thing (haystack_model
!= model
); then you will need to dig further.
However, loading and looking up models changed between django
1.7.0 and 1.8.0 (deprecation), and django.db.models.loading.get_model
was removed in 1.8.2.
Details on django-haystack
#1206.
Therefore, for django-haystack
to work with django
1.9.0 you need a release that includes this commit; that is to say django-haystack>=2.4.0
.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With