Django 2.0集成Haystack+Whoosh执行索引命令报错求助
解决Django 2.0 + Haystack + Whoosh搜索功能的两个兼容报错
我之前帮同事排查过一模一样的问题,你的两个报错确实都和Django 2.0与旧版Haystack的兼容性有关,下面分情况给你具体解决思路:
第一个报错:rebuild_index时的未知参数问题
TypeError: Unknown option(s) for clear_index command: batchsize, workers. Valid options are: ...
原因
旧版本的Haystack(低于2.8.0)的clear_index命令不支持batchsize和workers这两个参数,但rebuild_index命令会默认把这两个参数传递给clear_index,导致参数不匹配报错。而Django 2.0要求Haystack至少是2.8.0版本才能兼容。
解决方法
- 先检查当前Haystack版本:
pip show django-haystack - 如果版本低于2.8.0,直接升级:
pip install django-haystack --upgrade
升级后再执行rebuild_index,这个参数错误应该就会消失。
第二个报错:update_index时的__call__()参数缺失问题
TypeError: __call__() missing 1 required keyword-only argument: 'manager'
原因
Django 2.0对模型管理器(Model Manager)的调用逻辑做了调整,旧版Haystack在解析模型字段时,直接调用管理器实例的__call__方法(也就是current_object()),但Django 2.0里这个方法需要额外的manager关键字参数,导致报错。
解决方法
这个问题同样可以通过升级Haystack到2.8.0+解决,官方在这个版本里修复了管理器调用的兼容问题。
如果暂时无法升级,也可以临时修改Haystack的源码(不推荐,但应急可用):
- 找到虚拟环境中的
haystack/fields.py文件(路径类似你报错里的/home/zorig/.virtualenvs/ftm/lib/python3.5/site-packages/haystack/fields.py) - 定位到
resolve_attributes_lookup函数,找到这一行:values.append(current_object()) - 修改为直接获取管理器实例(或者获取查询集):
# 如果你需要的是管理器本身 values.append(current_object) # 如果你需要的是管理器对应的查询集 values.append(current_object.all())
修改后保存,再执行update_index应该就能正常运行。
总结
这两个问题本质都是旧版Haystack没有适配Django 2.0的API变化,最稳妥彻底的解决方式就是把Haystack升级到2.8.0及以上版本,升级完成后重新执行rebuild_index,整个搜索功能应该就能恢复正常了。
内容的提问来源于stack exchange,提问作者Zorig
相关产品推荐
相关产品推荐

