Django-haystack with the xapian engine: update_index cannot be executed if the model has ManyToManyField

After upgrading django to 1.7, I cannot execute the update_index control command.

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' 

I am using python2.7.6, django 1.7, django-haystack 2.3.1, search engine: xapian

I think the problem arises because django from 1.7 adds a call () method to ManyRelatedManager and now this condition occurs in the /haystack/fields.py file.

 if callable(current_object): return current_object() 

But in the call device_name must be defined, as we can see in the corresponding method

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

Thanks.

+5
source share
1 answer

Use a special method to return an array of strings or integers (use string patterns if you want to store more complex information in a single index field with multiple values).

 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 declaration for SOLR, including cut and auto-fill fields:

 <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" /> 
+1
source

Source: https://habr.com/ru/post/1206516/


All Articles