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)

接下来,在代码本身的实际设计上,还有一些需要调整的地方。

  • deferred api 序列化您的代码,因此实际上不需要从数据存储区重新查询实体。如果您坚持这一点,将 传递entity.key给 deferred 方法,它已经是 的实例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 回答