1

DocTypeORM に基づいて、マッピングを構築し、ドキュメントを保存するためのクラスを生成しています。

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_nameコードをデバッグして、とattributeに期待する値が含まれていることを確認しました。

これは機能します

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が myinstanceからdoc.

質問

何が原因でしょうか? なぜ両方の戦略が有効でないのか、私には理解できません。

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_searchModelDocType

于 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 に答える