2014-11-09 20 views
5

içeriyorsa update_index çalıştırılamıyor Django'yu 1.7'ye yükselttikten sonra update_index yönetim komutunu çalıştıramıyorum.Xapian motorlu Django-samanlık: model 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' 

Ben python2.7.6, Django 1.7, django-samanlık 2.3.1, arama motoru kullanmak: Xapian

Sorun görünür düşünüyorum çünkü 1.7 eklenti yönteminden Django ManyRelatedManager çağrısı() ve şimdi /haystack/fields.py dosyasında bu durum ateşleniyor.

if callable(current_object): 
    return current_object() 

Ama çağrı MANAGER_NAME içinde

biz uygun yöntemle

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

sayesinde görebileceğiniz nasıl tanımlanmalıdır.

+0

bu sorunu çözmek etmedi. Aynı sorunla karşılaştım. –

+0

@kobymeir, sorun ManyToMany alanı nedeniyle ortaya çıktı, biz sadece arama indeksinden kaldırıyoruz :) Bence bu iyi bir çözüm değil. – Znack

+0

Bu adamların herhangi bir güncellemesi. Ben de burada kaldım. – Tanuj

cevap

1

Dizeler veya tamsayılar dizisini döndürmek için özel bir yöntem kullanın (çok karmaşık bir indeks alanında daha karmaşık bilgileri saklamak istiyorsanız, dize desenlerini kullanın). Faceting ve otomatik tamamlanması için alanlar dahil olmak üzere solr için

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

Saha beyanı:

<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

Bu benim için çözüldü. 'My_m2m_field' inizin boş bir' indexes.CharField() 'olduğundan ve' indexes.CharField (model_attr = 'my_field') 'olduğundan emin olun. Teşekkürler @Risadinha! – Will

İlgili konular