Django-haystack: AttributeError at /search/ 'list'-Objekt hat kein Attribut 'split'

Erstellt am 24. Mai 2015  ·  10Kommentare  ·  Quelle: django-haystack/django-haystack

Anfragemethode: GET
Anforderungs-URL: http://localhost :8000/search/?q=Hallo
Django-Version: 1.8.1
Ausnahmetyp: AttributeError
Ausnahmewert:

'list'-Objekt hat kein Attribut 'split'

Ort der Ausnahme: /usr/local/lib/python2.7/dist-packages/haystack/backends/solr_backend.py in _process_results, Zeile 374
Ausführbare Python-Datei: /usr/bin/python
Python-Version: 2.7.8
Python-Pfad:

['/home/jr/everscoop_search',
'/usr/lib/python2.7',
'/usr/lib/python2.7/plat-x86_64-linux-gnu',
'/usr/lib/python2.7/lib-tk',
'/usr/lib/python2.7/lib-alt',
'/usr/lib/python2.7/lib-dynload',
'/usr/local/lib/python2.7/dist-packages',
'/usr/lib/python2.7/dist-packages',
'/usr/lib/python2.7/dist-packages/PILcompat',
'/usr/lib/python2.7/dist-packages/gtk-2.0',
'/usr/lib/python2.7/dist-packages/ubuntu-sso-client']

app_label, model_name = raw_result[DJANGO_CT].split(".")

Ich verwende Django 1.8.1 Bitte helfen Sie mir bei Problemen.

dependency updates

Hilfreichster Kommentar

@ krmritunjay11 Haben Sie eine Ahnung, was Ihr django_ct-Schema vom standardmäßigen Haystack-Standard geändert hat?

Alle 10 Kommentare

Das beißt mich auch, mit solr 5.2, django 1.8 und dem aktuellen django-haystack (mit pip). In /backends/solr_backend.py sehe ich:

378:        for raw_result in raw_results.docs:
379:            app_label, model_name = raw_result[DJANGO_CT].split('.')
380:            additional_fields = {}
381:            model = haystack_get_model(app_label, model_name)

Aber wenn ich solr über die Admin-API abfrage und mir den Antwortteil des zurückgegebenen JSON anschaue, sehe ich, dass das django_ct-Objekt tatsächlich eine Liste ist:

"django_ct": ["my_app_label.my_model_name",]

Also, was ist der Fehler?

  • sollte das solr-Backend über diese Liste iterieren (anstatt zu versuchen, als String darauf zuzugreifen)?
  • sollte das solr-Backend mit Zeichenfolgen oder Zeichenfolgenlisten elegant umgehen?
  • Stimmt etwas nicht mit der Befüllung des Solr-Index?

Vielleicht auch relevant, entweder mit django1.8 oder einem Downgrade auf django 1.7.7, manage.py build_solr_schema generiert die folgenden Feldspezifikationen:

<field name="django_ct" type="string" indexed="true" stored="true" multiValued="false"/>
<field name="django_id" type="string" indexed="true" stored="true" multiValued="false"/>

und selbst nach einem Downgrade auf django 1.7.7 und einem manage.py rebuild_index wurden sowohl django_ct als auch django_id von solr als "Listen mit einem Wert" zurückgegeben.

Schließt als Duplikat von #1182. Der Fix erfordert eine Aktualisierung, um die abwärtsinkompatible Änderung in Solr 5 zu verarbeiten.

Nach 3-4 Tagen erreichte ich die Lösung.

Lösung 1-: Änderung im Schema

Schritt 1: Gehen Sie zu Ihrer verwalteten Schemadatei für die Sammlung und bearbeiten Sie
Schritt 2: Suchen und ersetzen Sie <field name="django_ct" type="text_general"/> durch <field name="django_ct" type="string"/>

  • Betriebssystemversion: Ubuntu 14.04 LTS
  • Suchmaschinenversion: Solr 7.2.1
  • Python-Version: 3.4.3
  • Django-Version: 2.0
  • Heuhaufen-Version: 2.8.0

Lösung 2: Kerndatei hacken

Schritt 1: sudo vim /home/your path/site-packages/haystack/backends/solr_backend.py
Schritt 2: Suchen und ersetzen Sie app_label, model_name = raw_result[DJANGO_CT].split('.') durch app_label, model_name = raw_result[DJANGO_CT][0].split('.')

@ krmritunjay11 Haben Sie eine Ahnung, was Ihr django_ct-Schema vom standardmäßigen Haystack-Standard geändert hat?

Ich bin auch auf dieses Problem gestoßen; Ich hatte zwei Versionen von Solr auf meinem System, und es verwendete Solr 7.x anstelle von Solr 6.x. Bei mir funktioniert es jetzt mit Haystack 2.8, Solr 6.x und Django 2.0.

Um zu erläutern, was @mjwalter schreibt, komme ich nach einigen Tests mit verschiedenen Versionen (kein solcher Fehler bei solr 6.x) zu dem Schluss, dass haystack Solr 7.x nicht vollständig unterstützt. Die Django-Version sollte hier keine Rolle spielen. Ein Beispiel für einen Stack-Trace:
File "/Users//dev//theApp/forms.py", line 129, in search sqs.count() File "/Users//dev/virtual_envs/venv36/lib/python3.6/site-packages/haystack/query.py", line 522, in count return len(self) File "/Users//dev/virtual_envs/venv36/lib/python3.6/site-packages/haystack/query.py", line 86, in __len__ self._result_count = self.query.get_count() File "/Users//dev/virtual_envs/venv36/lib/python3.6/site-packages/haystack/backends/__init__.py", line 619, in get_count self.run() File "/Users//dev/virtual_envs/venv36/lib/python3.6/site-packages/haystack/backends/solr_backend.py", line 802, in run results = self.backend.search(final_query, **search_kwargs) File "/Users//dev/virtual_envs/venv36/lib/python3.6/site-packages/haystack/backends/__init__.py", line 33, in wrapper return func(obj, query_string, *args, **kwargs) File "/Users//dev/virtual_envs/venv36/lib/python3.6/site-packages/haystack/backends/solr_backend.py", line 149, in search distance_point=kwargs.get('distance_point')) File "/Users//dev/virtual_envs/venv36/lib/python3.6/site-packages/haystack/backends/solr_backend.py", line 425, in _process_results app_label, model_name = raw_result[DJANGO_CT].split('.') AttributeError: 'list' object has no attribute 'split'

Ich hatte dieses Problem mit

  • Betriebssystemversion: Ubuntu 18.04 LTS
  • Suchmaschinenversion: Solr 6.6.5
  • Python-Version: 3.6.6
  • Django-Version: 2.0.8
  • Heuhaufen-Version: 2.8.1

Gelöst mit

solr stop
rm <solr_home>/server/solr/<core>/conf/managed-schema
./manage.py build_solr_schema > <solr_home>/server/solr/<core>/conf/schema.xml
solr start
./manage.py rebuild_index

Ich bin mir nicht sicher, wie viel davon notwendig war, aber das löste es.

Passiert bei mir während der Verwendung von solr 8.0. @krmritunjay11 Das Ändern des Site-Pakets funktioniert für mich, aber ich musste eine zusätzliche Änderung in Zeile 462 von solr_backend.py vornehmen raw_results[DJANGO_ID] ist eigentlich ein Array für mich, also habe ich raw_results[DJANGO_ID][0] eingefügt.

Soweit mein Schema geht, hatte es bereits django_ct als <field name="django_ct" type="string" indexed="true" stored="true" multiValued="false"/> und es kommt direkt vom Verwaltungsbefehl

Ähnlich wie andere berichteten, musste ich ein paar Änderungen an solr_backed.py vornehmen. Ändern von [DJANGO_ID] in [DJANGO_ID][0] und [DJANGO_CT] in [DJANGO_CT][0]. Die Datei schema.xml erforderte keine Änderungen.

Verwenden von Solr 8.2.0, Django 2.2.6 und Haystack 2.8.1.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen

Verwandte Themen

simonsmiley picture simonsmiley  ·  10Kommentare

mdf-github picture mdf-github  ·  8Kommentare

SteveByerly picture SteveByerly  ·  8Kommentare

isaacpeka picture isaacpeka  ·  3Kommentare

jpatel3 picture jpatel3  ·  4Kommentare