如何使用父级传递ndb密钥并使用它来获取实体

时间:2013-01-14 01:48:34

标签: google-app-engine python-2.7 key app-engine-ndb ancestor

我将带有父项的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的重复。

更新:感谢Gregory

    entity = key.get()    # works fine

2 个答案:

答案 0 :(得分:2)

首先,回答你的代码特定问题,正确传递密钥,它不是可调用的:

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

接下来,关于代码本身的实际设计,有些事情需要调整。

  • 延迟api序列化您的代码,因此实际上不需要从数据存储区重新查询实体。如果您坚持这一点,将entity.key传递给延迟方法,它已经是ndb.Key的实例,因此不需要构造新的Key对象。

答案 1 :(得分:0)

我现在无法测试,但是:

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

Key构造函数接受几种不同的输入,并且从flat() Returns a tuple of flattened kind and id values (kind1, id1, kind2, id2, ...).开始,解包元组应该传递必要的输入。根据相同的链接,这也应该有效:

entity = ndb.Key(pairs=key.pairs())