1

我正在DocType基于我的 ORM 生成一个用于构建映射和保存文档的类。

def get_doc_type(self):
    attributes = {}

    ...
    # Build attributes dictionary here

    DT = type('DocType', (DocType,), attributes)
    return DT

这似乎工作正常,我对映射没有任何问题。我的问题是当我尝试保存文档时。

这不起作用

Doc = get_doc_type()

for instance in queryset:
    doc = Doc()
    for field_name in fields:
        attribute = getattr(instance, field_name, None)
        setattr(doc, field_name, attribute)
    doc.save(index)

发生这种情况时,确实会保存一个文档,但是,我的任何属性都没有设置。它只是一个空文档。

我已经调试了代码以确认field_nameattribute包含我期望的值。

这确实有效

Doc = self.get_doc_type()

for instance in queryset:
    kwargs = {}

    for field_name in fields:
        attribute = getattr(instance, field_name, None)
        kwargs.update({field_name: attribute})

    doc = Doc(**kwargs)
    doc.save(index=index)

当我使用此策略时,文档按预期保存,并且所有信息attributes都已从我传递instancedoc.

问题

这可能是什么原因造成的?为什么这两种策略都无效对我来说没有意义。

4

2 回答 2

2

我无法复制您的行为,因为一切对我来说都很好:

class DT(DocType):
    pass

dt = DT()

for x in range(10):
    setattr(dt, 'i_%i' % x, x)
dt.save()

DT.search().execute()[0].to_dict()

完全符合我的预期。如果它对您不起作用,您能否在 github 上提出问题,因为在这种情况下出现问题。谢谢!

顺便说一句,我在从 ORM 序列化到时通常做的elaasticsearch-dsl是直接在生成实例的对象上使用to_search或类似的方法。它使一切变得如此简单,包括使用信号同步两个数据集。ModelDocType

于 2016-12-25T15:46:37.303 回答
1

我猜在你的情况下,它必须有更多信息让save()方法知道field_name应该存储哪些。

也许是这样的:

    class Doc(object):
        def __init__(self, **kwargs):
            self.fields_valid = kwargs.copy()
            ...
        ...
        def save(self, index=None):
            ...
            for field in self.fields_valid:
                do_save(field)
            ....

因此,您应该查看 Doc 类中的__init__save方法,以了解持久化 Doc 对象的实际作用。

于 2016-12-25T05:17:21.807 回答