首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >嵌套字段在elasticsearch-dsl-py中索引时提供TypeError

嵌套字段在elasticsearch-dsl-py中索引时提供TypeError
EN

Stack Overflow用户
提问于 2018-04-06 17:52:24
回答 1查看 537关注 0票数 0

每当我试图保存一个包含嵌套字段的对象时,我都会得到一个类型错误。

TypeError: isinstance() arg 2 must be a type or tuple of types

我有以下文档类:

代码语言:javascript
复制
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()
    updation = Nested(UpdationIndex())

    class Meta:
        index = 'industry'

def bulk_indexing():

    elastic_connection = Elasticsearch(hosts=['localhost'], timeout=20)
    if elastic_connection.indices.exists('industry'):
        elastic_connection.indices.delete('industry')
    if elastic_connection.indices.exists('category'):
        elastic_connection.indices.delete('category')

    IndustryIndex.init()
    print('HI')
    bulk(client=elastic_connection, actions=(b.indexing() for b in models.Industry.objects.all()))

我的行业模型是一个django模型(我使用了mongoDB,所以它本身是一个动态文档),它被定义为

代码语言:javascript
复制
class Industry(DynamicDocument,BaseCreationUpdation):
    name=StringField(required=True,unique=True)

    def save(self,*args,**kwargs):
        '''
        '''
        self=save_created_updated_info(self)
        super(Industry,self).save(args,kwargs)

    def indexing(self):
        objCreation = CreationIndex(
            created_by = self.creation.created_by,
            created_date = self.creation.created_date.date().isoformat()
            )
        print(objCreation.to_dict())
        obj = IndustryIndex(
            meta = {'id': str(self.id)},
            name = self.name,
            creation = objCreation.to_dict(),
            updation = [],
            )

        for objUp in self.updation:

            objUpdation = UpdationIndex(
                updated_by = objUp.updated_by,
                updated_date = objUp.updated_date.date().isoformat()
                )
            print(objUpdation)
            obj.updation.append(objUpdation)
            print()
            print(obj.to_dict())
            print()
        obj.save()

        return obj.to_dict(include_meta=True)

    @classmethod
    def index_document(cls,sender, document, **kwargs):
        document.indexing()

现在,每当我运行bulk_indexing模块时,它都会出现一个问题:

代码语言:javascript
复制
Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File "D:\projects\django\bhetincha\category\search.py", line 57, in bulk_indexing
    bulk(client=elastic_connection, actions=(b.indexing() for b in models.Industry.objects.all()))
  File "C:\Users\prabi\Envs\bhetincha\lib\site-packages\elasticsearch\helpers\__init__.py", line 257, in bulk
    for ok, item in streaming_bulk(client, actions, **kwargs):
  File "C:\Users\prabi\Envs\bhetincha\lib\site-packages\elasticsearch\helpers\__init__.py", line 180, in streaming_bulk
    client.transport.serializer):
  File "C:\Users\prabi\Envs\bhetincha\lib\site-packages\elasticsearch\helpers\__init__.py", line 58, in _chunk_actions
    for action, data in actions:
  File "D:\projects\django\bhetincha\category\search.py", line 57, in <genexpr>
    bulk(client=elastic_connection, actions=(b.indexing() for b in models.Industry.objects.all()))
  File "D:\projects\django\bhetincha\category\models.py", line 80, in indexing
    obj.save()
  File "C:\Users\prabi\Envs\bhetincha\lib\site-packages\elasticsearch_dsl\document.py", line 405, in save
    self.full_clean()
  File "C:\Users\prabi\Envs\bhetincha\lib\site-packages\elasticsearch_dsl\utils.py", line 417, in full_clean
    self.clean_fields()
  File "C:\Users\prabi\Envs\bhetincha\lib\site-packages\elasticsearch_dsl\utils.py", line 403, in clean_fields
    data = field.clean(data)
  File "C:\Users\prabi\Envs\bhetincha\lib\site-packages\elasticsearch_dsl\field.py", line 179, in clean
    data = super(Object, self).clean(data)
  File "C:\Users\prabi\Envs\bhetincha\lib\site-packages\elasticsearch_dsl\field.py", line 90, in clean
    data = self.deserialize(data)
  File "C:\Users\prabi\Envs\bhetincha\lib\site-packages\elasticsearch_dsl\field.py", line 81, in deserialize
    for d in data
  File "C:\Users\prabi\Envs\bhetincha\lib\site-packages\elasticsearch_dsl\field.py", line 81, in <listcomp>
    for d in data
  File "C:\Users\prabi\Envs\bhetincha\lib\site-packages\elasticsearch_dsl\field.py", line 160, in _deserialize
    if isinstance(data, self._doc_class):
TypeError: isinstance() arg 2 must be a type or tuple of types

为什么会出现这个错误?当我移除嵌套的更新字段时,虽然创建字段是相同的,但都可以正常工作。这里有什么问题?

EN

回答 1

Stack Overflow用户

发布于 2018-04-07 10:43:52

初始化嵌套字段的方式是错误的-你需要传递一个类而不是类的实例作为构造函数的参数(即去掉括号):

代码语言:javascript
复制
updation = Nested(UpdationIndex)  # Instead of Nested(UpdationIndex())
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49690045

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档