1

親を持つ NDB Key() を遅延関数に渡します。この関数では、エンティティを再度取得します。しかし、渡されたキーを使用してエンティティを直接取得することはできません。ndb.Key() でキーの順序のペアリングを変更する必要があります。

deferred.defer(my_deferred.a_function, entity.key)  

entity.key() は次のようになります。

Key('Parents', 'my_parent', 'Childs', 'my_child')    # the first pair is the parent?

my_deferred.py :

def a_function(key) :

    entity = ndb.Key(key)  # the pass entity.key does not work !!!!!

例外を与える: ValueError: Key() には偶数の位置引数が必要です。

    entity = ndb.Key('Childs', key.id(), parent = key.parent()).get() # this one works fine

entity.key() メソッドが直接使用できるキーを提供しない理由がわかりません。または、キーを「変更」せずにエンティティを取得する別の方法があります。そして、ValueErrorの例外がわかりません。

更新:グレゴリーに感謝

    entity = key.get()    # works fine
4

2 に答える 2

2

まず、コード固有の質問に答え、キーを適切に渡すと、呼び出し可能ではありません。

deferred.defer(my_deferred.a_function, entity.key)

次に、コード自体の実際の設計について、微調整が必​​要なことがいくつかあります。

  • 遅延APIはコードをシリアル化するため、データストアからエンティティを再クエリする必要はありません。ただし、これを主張する場合は、をentity.keydeferedメソッドに渡すと、それはすでにのインスタンスでndb.Keyあるため、新しいKeyオブジェクトを作成する必要はありません。
于 2013-01-14T02:13:46.607 に答える
0

現在、これをテストすることはできませんが、どうでしょうか。

entity = ndb.Key(*key.flat())

Keyコンストラクターは、いくつかの異なる種類の入力を受け入れます。これflat() により、フラット化された種類とIDの値(kind1、id1、kind2、id2、...)のタプルが返されます。、タプルを解凍すると、必要な入力が渡​​されるはずです。同じリンクごとに、これも機能するはずです。

entity = ndb.Key(pairs=key.pairs())
于 2013-01-14T02:08:23.380 に答える