我将带有父项的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
答案 0 :(得分:2)
首先,回答你的代码特定问题,正确传递密钥,它不是可调用的:
deferred.defer(my_deferred.a_function, entity.key)
接下来,关于代码本身的实际设计,有些事情需要调整。
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())