django-haystack - Обновление индекса после добавления нового поля в индекс, вызывающее ошибку

У меня есть сайт django, который использует Haystack с бэкэндом Xapian для индексации поиска. Я добавил новое поле в одну из индексируемых моделей, а затем добавил это поле в SearchIndex для этой модели. я бежал:

python manage.py update_index

Чтобы обновить индекс, но я получаю следующую ошибку:

Traceback (most recent call last):
  File "manage.py", line 11, in <module>
    execute_manager(settings)
  File "/usr/local/lib/python2.6/dist-packages/django/core/management/__init__.py", line 438, in execute_manager
    utility.execute()
  File "/usr/local/lib/python2.6/dist-packages/django/core/management/__init__.py", line 379, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "/usr/local/lib/python2.6/dist-packages/django/core/management/base.py", line 191, in run_from_argv
    self.execute(*args, **options.__dict__)
  File "/usr/local/lib/python2.6/dist-packages/django/core/management/base.py", line 220, in execute
    output = self.handle(*args, **options)
  File "/usr/local/lib/python2.6/dist-packages/django_haystack-1.0.1_final-py2.6.egg/haystack/management/commands/update_index.py", line 51, in handle
    self.handle_app(None, **options)
  File "/usr/local/lib/python2.6/dist-packages/django_haystack-1.0.1_final-py2.6.egg/haystack/management/commands/update_index.py", line 107, in handle_app
    index.backend.update(index, small_cache_qs[start:end])
  File "/usr/local/lib/python2.6/dist-packages/xapian_haystack-1.1.3beta-py2.6.egg/xapian_backend.py", line 204, in update
    data = index.prepare(obj)
  File "/usr/local/lib/python2.6/dist-packages/django_haystack-1.0.1_final-py2.6.egg/haystack/indexes.py", line 102, in prepare
    self.prepared_data[field_name] = field.prepare(obj)
  File "/usr/local/lib/python2.6/dist-packages/django_haystack-1.0.1_final-py2.6.egg/haystack/fields.py", line 119, in prepare
    return self.convert(super(CharField, self).prepare(obj))
  File "/usr/local/lib/python2.6/dist-packages/django_haystack-1.0.1_final-py2.6.egg/haystack/fields.py", line 75, in prepare
    raise SearchFieldError("The model '%s' has an empty model_attr '%s' and doesn't allow a default or null value." % (repr(current_object), attr))
haystack.exceptions.SearchFieldError: The model 'None' has an empty model_attr 'address_county' and doesn't allow a default or null value.

Я использую версии django 1.2 и django-haystack 1.0.1. Обновлять их до новейшей версии на данный момент не вариант для меня.


person hellsgate    schedule 13.12.2011    source источник
comment
Я решил эту проблему, добавив null=True в search_indexes для нулевого поля.   -  person Paolo    schedule 29.01.2013
comment
@Guandalino: я думаю, что тогда моя проблема, должно быть, немного отличалась от вашей, как вы увидите из ответа ниже, что решение было противоположным   -  person hellsgate    schedule 01.02.2013


Ответы (2)


Я нашел ответ. Подсказка заключалась в сообщении об ошибке (которое, как мы все знаем, случается не всегда!):

The model 'None' has an empty model_attr 'address_county' and doesn't allow a default or null value.

Мое поле модели было создано с помощью blank=True, null=True. Это вызвало ошибку, поэтому я удалил их и добавил default='', и это позволило мне обновить индекс без ошибок. Надеюсь, это когда-нибудь поможет кому-то!

person hellsgate    schedule 13.12.2011
comment
Вы имеете в виду, что изменили свою модель django? Замена пустого = True, null = True на default = '' в вашем поле address_country? Вы снова запускали ./manage.py build_solr_schema после этого? - person harisibrahimkv; 02.12.2013
comment
@harisibrahimkv: Да, я изменил свою модель django. Однако я не запускал эту команду управления, так как использовал Haystack, а не SOLR для своего поискового сервера. Однако я выполнил аналогичную команду для Haystack. Я просто не могу вспомнить, что это была за команда. - person hellsgate; 03.12.2013
comment
Хм. Я попытался изменить свою модель и снова запустить build_solr_schema. Это не помогло. Я также использую Haystack, но не наткнулся на какую-либо конкретную команду, которую нужно запустить, чтобы отразить это изменение. - person harisibrahimkv; 04.12.2013
comment
@harisibrahimkv: Извините, я немного запутался. Хотя я использовал Haystack, поисковой системой, которую я использовал, был Xapian. Вы видели django-haystack.readthedocs.org/en/latest/tutorial .html#reindex и попытался выполнить повторную индексацию. Если у вас есть или если это не работает, я бы порекомендовал задать свой вопрос, поскольку я не работал ни с одним из них (кроме Django) уже пару лет. - person hellsgate; 04.12.2013
comment
Предпочтительный метод должен помечать соответствующее поле как пустое в индексе, как указано в stackoverflow.com/a/22695639/147021. Помните, пробел ('') и ноль — это не одно и то же! - person Barun; 04.04.2014

Я столкнулся с той же проблемой при индексации поля телефона моего модального окна. Я просто добавляю null=True в поле solr в search_index.py.

phone = CharField(model_attr="phone", null=True)

person Shahid Tariq    schedule 02.07.2019