elasticsearch-dsl-py嵌套字段索引触发TypeError错误求助
解决elasticsearch-dsl-py中嵌套字段保存时的TypeError问题
我一眼就定位到问题所在了——你在定义updation字段时犯了一个很容易踩的小坑:给Nested传入了UpdationIndex的实例,而非它的类本身。
错误原因解析
elasticsearch-dsl-py的Nested字段要求传入的是InnerDoc的类(比如UpdationIndex),而不是已经实例化的对象(UpdationIndex())。当你传入实例时,内部的isinstance()检查会尝试验证类型,但第二个参数变成了实例而非类型,这就直接触发了你看到的TypeError: isinstance() arg 2 must be a type or tuple of types错误。
修正后的代码
把updation = Nested(UpdationIndex())改成updation = Nested(UpdationIndex)就能解决问题。完整的修正后类定义如下:
from elasticsearch_dsl import InnerDoc, DocType, Text, Keyword, Date, Nested class CreationIndex(InnerDoc): created_by = Keyword() created_date = Date() class UpdationIndex(InnerDoc): updated_by = Keyword() updated_date = Date() class IndustryIndex(DocType): name = Text(analyzer='english') creation = CreationIndex() # 这里是正确的,普通InnerDoc字段直接用类实例化 updation = Nested(UpdationIndex) # 修正:传入类而非实例 class Meta: index = 'industry' def bulk_indexing(self, data): # 保留你原有的bulk_indexing实现即可 pass
额外提示
- 对于单条嵌套记录(比如
creation),直接用InnerDoc类实例化定义字段就足够; - 而
Nested类型是专门用来处理数组形式的嵌套文档(比如一个行业可能有多次更新记录),所以它需要绑定对应的文档类,而非单个实例。如果你的updation只是单条记录,其实可以去掉Nested,直接用UpdationIndex()定义,和creation保持一致。
内容的提问来源于stack exchange,提问作者Prabin Bhandari
相关产品推荐
相关产品推荐

