Haystack / Whoosh 索引生成错误

3 投票
4 回答
2434 浏览
提问于 2025-04-15 17:26

我正在尝试设置haystack,并使用whoosh作为后端。当我尝试生成索引(或者说任何与索引相关的命令)时,我收到了以下错误:

TypeError: Item in ``from list'' not a string

如果我完全删除我的search_indexes.py文件,还是会出现同样的错误(所以我猜测它根本找不到这个文件)

是什么导致了这个错误呢?它设置为自动发现,我确定我的应用程序已经安装,因为我现在正在使用它。

完整的错误追踪信息:

    Traceback (most recent call last):
  File "./manage.py", line 17, in <module>
    execute_manager(settings)
  File "/Users/ghostrocket/Development/Redux/.dependencies/django/core/management/__init__.py", line 362, in execute_manager
    utility.execute()
  File "/Users/ghostrocket/Development/Redux/.dependencies/django/core/management/__init__.py", line 303, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "/Users/ghostrocket/Development/Redux/.dependencies/django/core/management/__init__.py", line 257, in fetch_command
    klass = load_command_class(app_name, subcommand)
  File "/Users/ghostrocket/Development/Redux/.dependencies/django/core/management/__init__.py", line 67, in load_command_class
    module = import_module('%s.management.commands.%s' % (app_name, name))
  File "/Users/ghostrocket/Development/Redux/.dependencies/django/utils/importlib.py", line 35, in import_module
    __import__(name)
  File "/Users/ghostrocket/Development/Redux/.dependencies/haystack/__init__.py", line 124, in <module>
    handle_registrations()
  File "/Users/ghostrocket/Development/Redux/.dependencies/haystack/__init__.py", line 121, in handle_registrations
    search_sites_conf = __import__(settings.HAYSTACK_SITECONF)
  File "/Users/ghostrocket/Development/Redux/website/../website/search_sites.py", line 2, in <module>
    haystack.autodiscover()
  File "/Users/ghostrocket/Development/Redux/.dependencies/haystack/__init__.py", line 83, in autodiscover
    app_path = __import__(app, {}, {}, [app.split('.')[-1]]).__path__
TypeError: Item in ``from list'' not a string

这是我的search_indexes.py文件:

from haystack import indexes
from haystack import site
from myproject.models import *

site.register(myobject)

4 个回答

2

在我的情况下,这个问题发生在我把django-tastypie升级到0.10版本之后。为了适应Python 3的变化,from __future__ import unicode_literals这行代码被加到了迁移文件的最上面。

在每个tastypie的迁移文件中把这一行注释掉后,我的迁移就顺利进行了。

让我感到困惑的是,昨天在另一个共享同一个虚拟环境的项目中,新的tastypie版本的迁移居然运行得很好。这真是个谜,留待以后再说。

8

我刚遇到了一个完全不同的错误信息,但也是个TypeError。

我在网上搜索了整个错误信息,找到了两个结果:一个是这个问题,另一个是Python的import.c源代码。

经过一些调查,我发现这个错误是因为传给内置的__import__函数的导入名称不是字符串。

这里的关键字是字符串,也就是str对象。其他类型的东西(比如unicode)会被拒绝,并显示这里描述的错误。

所以解决办法是:无论你在哪里传递模块或成员名称给需要动态导入的地方,确保它是str类型,而不是unicode

失败的例子:

__import__('mylib.foo', globals(), locals(), [u'bar'])

成功的例子:

__import__('mylib.foo', globals(), locals(), ['bar'])
__import__(u'mylib.foo', globals(), locals(), ['bar'])

当然,这个问题可能只和Python 2.x有关,因为在3.x中字符串和unicode的处理方式不同。

1

看起来你遇到了两个问题。

第一个问题是导致出现 TypeError 的原因。这个错误发生在 Haystack 正在检查你在 INSTALLED_APPS 中列出的每个应用时,它在寻找一个叫 search_indexes.py 的文件(因为你是自动注册的)。我不太确定具体是什么问题,但我建议你在项目中搜索一下 from list,然后仔细检查一下你的代码。我之前没有遇到过这个异常,但如果这是你写的代码出现的问题,你应该在提问时把相关的代码部分贴出来。

我认为你无论有没有 search_indexes.py 文件都会得到同样的错误,是因为程序根本没有到达执行那个文件代码的那一步。

说到这里,那个文件里应该还有更多的内容(这就是第二个问题)。你需要创建一个索引类(这个类要继承自 haystack.indexes.SearchIndex),并把它和模型注册起来。你可以查看 文档的这一部分,里面有说明和示例。

我还建议你在 django-haystack Google 组 提问,因为那里的作者和其他使用 Haystack 的用户会看到你的问题,他们通常会非常乐于帮助。

撰写回答