2014-11-09 3 views
5

После обновления django до 1.7 я не могу выполнить команду управления update_index.Django-haystack с xapian engine: не может выполнить update_index, если у модели есть ManyToManyField

Traceback (most recent call last): 
    File "/opt/pycharm-3.4.1/helpers/pydev/pydevd.py", line 1733, in <module> 
    debugger.run(setup['file'], None, None) 
    File "/opt/pycharm-3.4.1/helpers/pydev/pydevd.py", line 1226, in run 
    pydev_imports.execfile(file, globals, locals) # execute the script 
    File "/home/tochium/projects/povary/manage.py", line 10, in <module> 
    execute_from_command_line(sys.argv) 
    File "/home/tochium/projects/povary/local/lib/python2.7/site-packages/django/core/management/__init__.py", line 385, in execute_from_command_line 
    utility.execute() 
    File "/home/tochium/projects/povary/local/lib/python2.7/site-packages/django/core/management/__init__.py", line 377, in execute 
    self.fetch_command(subcommand).run_from_argv(self.argv) 
    File "/home/tochium/projects/povary/local/lib/python2.7/site-packages/django/core/management/base.py", line 288, in run_from_argv 
    self.execute(*args, **options.__dict__) 
    File "/home/tochium/projects/povary/local/lib/python2.7/site-packages/django/core/management/base.py", line 338, in execute 
    output = self.handle(*args, **options) 
    File "/home/tochium/projects/povary/src/django-haystack/haystack/management/commands/update_index.py", line 184, in handle 
    return super(Command, self).handle(*items, **options) 
    File "/home/tochium/projects/povary/local/lib/python2.7/site-packages/django/core/management/base.py", line 503, in handle 
    label_output = self.handle_label(label, **options) 
    File "/home/tochium/projects/povary/src/django-haystack/haystack/management/commands/update_index.py", line 189, in handle_label 
    self.update_backend(label, using) 
    File "/home/tochium/projects/povary/src/django-haystack/haystack/management/commands/update_index.py", line 234, in update_backend 
    do_update(backend, index, qs, start, end, total, self.verbosity) 
    File "/home/tochium/projects/povary/src/django-haystack/haystack/management/commands/update_index.py", line 89, in do_update 
    backend.update(index, current_qs) 
    File "/home/tochium/projects/povary/src/xapian-haystack/xapian_backend.py", line 355, in update 
    data = index.full_prepare(obj) 
    File "/home/tochium/projects/povary/src/django-haystack/haystack/indexes.py", line 207, in full_prepare 
    self.prepared_data = self.prepare(obj) 
    File "/home/tochium/projects/povary/src/django-haystack/haystack/indexes.py", line 198, in prepare 
    self.prepared_data[field.index_fieldname] = field.prepare(obj) 
    File "/home/tochium/projects/povary/src/django-haystack/haystack/fields.py", line 159, in prepare 
    return self.convert(super(CharField, self).prepare(obj)) 
    File "/home/tochium/projects/povary/src/django-haystack/haystack/fields.py", line 106, in prepare 
    return current_object() 
    File "/home/tochium/projects/povary/local/lib/python2.7/site-packages/django/db/models/fields/related.py", line 839, in __call__ 
    manager = getattr(self.model, kwargs.pop('manager')) 
KeyError: u'manager' 

Я использую python2.7.6, Джанго 1.7, Джанго-стог 2.3.1, поисковую систему: Xapian

Я думаю, что появляется проблема, потому что Джанго от метода 1,7 надстройки вызова() для ManyRelatedManager и теперь в файле /haystack/fields.py это условие срабатывает.

if callable(current_object): 
    return current_object() 

Но вызов manager_name должен быть определен, как мы можем видеть в соответствующем методе

def __call__(self, **kwargs): 
     # We use **kwargs rather than a kwarg argument to enforce the 
     # `manager='manager_name'` syntax. 
     manager = getattr(self.model, kwargs.pop('manager')) 

Спасибо.

+0

вы решить эту проблему. Я столкнулся с той же проблемой. –

+0

@kobymeir, проблема возникла из-за многоголосного поля, мы просто удалим его из индекса поиска :) Я думаю, что это нехорошее решение. – Znack

+0

Любое обновление этого парня. Я тоже застрял здесь. – Tanuj

ответ

1

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

class MyModelIndex(indexes.SearchIndex, indexes.Indexable): 
    my_m2m_field = indexes.CharField() 

    def prepare_my_m2m_field(self, my_model): 
     return [m2m.prop for m2m in my_model.m2m_field.all()] 

поля декларация ГУМЗА включая поле для огранки и автозаполнения:

<field name="my_m2m_field" type="text_general" indexed="true" stored="true" multiValued="true"/> 
<field name="my_m2m_field_exact" type="string" indexed="true" stored="false" multiValued="true"/> 
<field name="my_m2m_field_ac" type="ngram" indexed="true" stored="true" multiValued="true" 
     termVectors="true" termPositions="true" termOffsets="true"/> 
<copyField source="my_m2m_field" dest="emotion_exact" /> 
<copyField source="my_m2m_field" dest="emotion_ac" /> 
+0

Это решило это для меня. Убедитесь, что ваше 'my_m2m_field' является просто пустым' indexes.CharField() ', а не' indexes.CharField (model_attr = 'my_field') '. Спасибо @Risadinha! – Will

 Смежные вопросы

  • Нет связанных вопросов^_^