2016-01-03 16 views
7

Próbuję użyć Haystack i Whoosh z moją aplikacją Django. I po kroki na docs stogu siana, ale otrzymuję ten błąd, kiedy nie szukajDjango-Haystack podając błąd atrybutu?

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() 

nie mogłem znaleźć pomoc na temat tego błędu w dowolnym miejscu, co ja robię źle?

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
Stóg 2.4.1
Whoosh 2.7.0

+0

myślę pełny traceback jest konieczne. – kxxoling

+0

BTW, jakie wersje są twoje Django, Haystack i Whoosh? Znalazłem podobny błąd w starej wersji Haystack, która ukrywa prawdziwy błąd. – kxxoling

+0

Dzięki za odpowiedź, zaktualizowałem pytanie tak jak powiedziałeś. – doctorsherlock

Odpowiedz

6

To mi wygląda na problem kompatybilności pomiędzy wersją Haystack i Django. Django ostatnio przerobił system get_model (myślę, że w wersji 1.9), więc jeśli zaktualizowałeś Django, a nie Haystack - a może odwrotnie - to może być problem.

Zgaduję, że referencje get_model() w pliku indeksu są potencjalnymi czerwonymi śledzia, a problem dotyczy wewnętrznych elementów Haystack, ponieważ nie jest w stanie znaleźć tej metody tam, gdzie jej oczekuje.

+0

To wydaje się być problemem, co powinienem zrobić? – doctorsherlock

+0

Zainstalowałem Django 1.8.8 i teraz działa. Musi być problem z Django 1.9 – doctorsherlock

+0

Powiedziałbym bardziej prawdopodobny problem ze zgodnością Haystacka - lub potencjalnie problem zgodności z Whoosh - z Django 1.9 – Steadman

6

Wymieniłem następującą linię w stogu \ forms.py:

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

przez to:

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])) 

z importem

from django.apps import apps 

znalazłem linii, aby zmienić po prostu śledząc komunikat o błędzie, który otrzymywałem. Wydaje się, że dla Ciebie wygląda to w "/home/dr_sherlock/movienalyse/virmovienalyse/local/lib/python2.7/site-packages/haystack/forms.py"

EDYCJA: Uzyskanie najnowszej wersji stogu siana rozwiązuje problem Emisja

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

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

+1

Dla mnie też działała najnowsza wersja programu haystack – thanksd

0

Wystarczy zdefiniować nową metodę w swojej klasie wyszukiwanie Index (search_indexes.py)

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

    def get_model(self): 
     return mymodel 
Powiązane problemy