2016-01-03 16 views
7

Sto cercando di usare Haystack e Whoosh con la mia app Django. Ho seguito i passaggi su documenti Haystack, ma sto ottenendo questo errore quando faccio una ricercaDjango-Haystack che dà errore di attributo?

AttributeError at /search/ 
'module' object has no attribute 'get_model' 

search_indexes.py -

import datetime 
from haystack import indexes 
from movies.models import Movie 


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

    def get_model(self): 
     return Movie 

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

non ho potuto trovare aiuto su questo errore da nessuna parte, che cosa sono sto sbagliando?

Stacktrace -

Environment: 


Request Method: GET 
Request URL: http://127.0.0.1:8000/search/?q=The+Revenant&models=movies.movie 

Django Version: 1.9.1 
Python Version: 2.7.6 
Installed Applications: 
('django.contrib.admin', 
'django.contrib.auth', 
'django.contrib.contenttypes', 
'django.contrib.sessions', 
'django.contrib.messages', 
'django.contrib.staticfiles', 
'whoosh', 
'haystack', 
'registration', 
'crispy_forms', 
'movies', 
'mptt') 
Installed Middleware: 
('django.contrib.sessions.middleware.SessionMiddleware', 
'django.middleware.common.CommonMiddleware', 
'django.middleware.csrf.CsrfViewMiddleware', 
'django.contrib.auth.middleware.AuthenticationMiddleware', 
'django.contrib.auth.middleware.SessionAuthenticationMiddleware', 
'django.contrib.messages.middleware.MessageMiddleware', 
'django.middleware.clickjacking.XFrameOptionsMiddleware', 
'django.middleware.security.SecurityMiddleware') 



Traceback: 

File "/home/dr_sherlock/movienalyse/virmovienalyse/local/lib/python2.7/site-packages/django/core/handlers/base.py" in get_response 
    149.      response = self.process_exception_by_middleware(e, request) 

File "/home/dr_sherlock/movienalyse/virmovienalyse/local/lib/python2.7/site-packages/django/core/handlers/base.py" in get_response 
    147.      response = wrapped_callback(request, *callback_args, **callback_kwargs) 

File "/home/dr_sherlock/movienalyse/virmovienalyse/local/lib/python2.7/site-packages/haystack/views.py" in __call__ 
    51.   self.results = self.get_results() 

File "/home/dr_sherlock/movienalyse/virmovienalyse/local/lib/python2.7/site-packages/haystack/views.py" in get_results 
    91.   return self.form.search() 

File "/home/dr_sherlock/movienalyse/virmovienalyse/local/lib/python2.7/site-packages/haystack/forms.py" in search 
    116.   return sqs.models(*self.get_models()) 

File "/home/dr_sherlock/movienalyse/virmovienalyse/local/lib/python2.7/site-packages/haystack/forms.py" in get_models 
    110.     search_models.append(models.get_model(*model.split('.'))) 

Exception Type: AttributeError at /search/ 
Exception Value: 'module' object has no attribute 'get_model' 

Python 2.7.6
Django 1.9.1
Haystack 2.4.1
Fruscio 2.7.0

+0

Penso piena traceback è necessario. – kxxoling

+0

BTW, quali versioni sono il tuo Django, Haystack e Whoosh? Ho trovato alcuni errori simili con la vecchia versione di Haystack che nascondono il vero errore dietro. – kxxoling

+0

Grazie per la tua risposta, ho aggiornato la domanda come hai detto. – doctorsherlock

risposta

6

Questo mi sembra un problema di compatibilità tra la versione di Haystack e Django. Django ha recentemente rielaborato il sistema get_model (credo in 1.9), quindi se hai aggiornato Django e non Haystack - o forse viceversa - questo potrebbe essere il problema.

Sto supponendo che i riferimenti get_model() nel file di indice siano un potenziale red-herring e che il problema sia all'interno degli interni di Haystack, in quanto non è in grado di trovare il metodo in cui si aspetta.

+0

Sembra il problema, cosa dovrei fare? – doctorsherlock

+0

Ho installato Django 1.8.8 e ora funziona. Deve essere un problema con Django 1.9 – doctorsherlock

+0

Avrei detto più probabilmente un problema di compatibilità Haystack - o potenzialmente un problema di compatibilità di Whoosh - con Django 1.9 – Steadman

6

ho sostituito la seguente riga nel pagliaio \ forms.py:

if self.is_valid(): 
     for model in self.cleaned_data['models']: 
      search_models.append(models.get_model(*model.split('.'))) 

da questo:

if self.is_valid(): 
     for model in self.cleaned_data['models']: 
      model_info = model.split('.') 
      search_models.append(apps.get_model(app_label=model_info[0], model_name=model_info[1])) 

Con l'importazione

from django.apps import apps 

ho trovato la linea per cambiare semplicemente seguendo l'errore callstack che stavo ottenendo. Per te, sembra essere in "/home/dr_sherlock/movienalyse/virmovienalyse/local/lib/python2.7/site-packages/haystack/forms.py"

MODIFICA: Ottenere l'ultima versione di pagliaio risolve il problema problema

pip uninstall django-haystack 
pip install git+https://github.com/django-haystack/django-haystack.git 

da Django-Haystack: 'NoneType' object has no attribute '_default_manager'

+1

Ottenere l'ultima versione di pagliaio ha funzionato anche per me – thanksd

0

Basta definire un nuovo metodo nella classe Index Search (search_indexes.py)

from .models import mymodel 
from haystack import indexes 
class MyIndex(indexes.SearchIndex,indexes.Indexable): 

    def get_model(self): 
     return mymodel