2013-01-14 3 views
1

부모와 함께 NDB Key()를 지연 함수에 전달합니다. 이 함수에서 엔티티를 다시 검색합니다. 하지만 전달 된 키를 사용하여 엔티티를 직접 가져올 수는 없습니다. ndb.Key()에서 키 순서 페어링을 변경해야합니다.부모와 함께 ndb 키를 전달하고이를 사용하여 엔티티를 얻는 방법

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를이 : 키() 위치 인수의 짝수 번호가 있어야합니다

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

entity.key는()처럼 보인다 .

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

왜 entity.key() 메서드가 직접 키를 제공하지 않는지 이해할 수 없습니까? 또는 키를 "변경"하지 않고 엔티티를 가져 오는 다른 방법이 있습니다. 그리고 저는 ValueError에 대한 이해를하지 못합니다.

업데이트 : 그레고리

덕분에
entity = key.get() # works fine 

답변

2

첫째, 코드의 특정 질문에 대답 제대로 키를 전달하는 것은, 그것이 호출되지 않습니다 :

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

다음, 실제에 코드 자체의 디자인에는 조정이 필요한 몇 가지 사항이 있습니다.

  • 지연된 API는 코드를 직렬화하므로 실제로 데이터 저장소에서 엔터티를 다시 쿼리 할 필요가 없습니다. 이 방법을 고집하면 entity.key을 지연된 메서드에 전달하면 이미 ndb.Key의 인스턴스이므로 새 Key 객체를 만들 필요가 없습니다.
+0

Tahnks. 미안 해요, 내 질문에 entity.key() mistyped (내 코드가 아닌) 및 entity.key 변경되었습니다. 한 번 읽은 적이 있습니다 : 엔티티를 작업에 전달하지 마십시오. 하지만 열쇠를 건네 주면 열쇠 만. 그리고 entity.key를 전달할 때 키의 첫 번째 쌍이 부모를 보유하기 때문에 키를 직접 사용할 수 없습니다. – voscausa

+0

답을 다시 읽으십시오. 나는 시도했다 : key.get(). 예, 괜찮습니다. 고마워요! – voscausa

+0

걱정하지 마세요. 기꺼이 도와 드리겠습니다. :) –

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()) 
+0

이 방법이 효과적 일지는 모르겠지만 그렇게하는 것은 비현실적입니다. 그는 이미 열쇠를 가지고 있으므로 새 열쇠를 만들 필요가 없습니다. – bossylobster

+0

@bossylobster 사실, 약간의 펑키 느낌이 들었습니다. 어쨌든 다른 대답에 투표했습니다. – RocketDonkey

+0

문제는 : 키가 있지만, 키가 받아 들여지지 않아이 키로 새 키를 만들어야합니다. 너의 대답은 – voscausa