как передать ключ ndb с родителем и использовать его для получения объекта

Я передаю 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

person voscausa    schedule 14.01.2013    source источник


Ответы (2)


во-первых, отвечая на конкретный вопрос вашего кода, правильно передавая ключ, это не вызывается:

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

затем, что касается фактического дизайна самого кода, есть некоторые вещи, которые нуждаются в настройке.

  • отложенный API сериализует ваш код, поэтому нет необходимости повторно запрашивать объект из хранилища данных. если вы настаиваете на этом, передавая entity.key отложенному методу, это уже экземпляр ndb.Key, поэтому нет необходимости создавать новый объект Key.
person grgry    schedule 14.01.2013
comment
Спасибо за ваш ответ. Извините, я неправильно набрал entity.key() в своем вопросе (не в своем коде) и изменил его на entity.key. Однажды я прочитал: никогда не передавайте сущность задаче. Но если я передам ключ, только ключ. И когда я передаю entity.key, я не могу использовать ключ напрямую, потому что первая пара ключей содержит родителя. - person voscausa; 14.01.2013
comment
Читаю ваш ответ еще раз. Я пробовал: key.get(). Да, это работает отлично, спасибо! - person voscausa; 14.01.2013

Я не могу проверить это прямо сейчас, но как насчет:

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

Конструктор Key принимает несколько различных типов входных данных, а поскольку flat() возвращает кортеж сглаженных значений типа и идентификатора (вид1, id1, вид2, id2, ...)., распаковка кортежа должна пройти через необходимые входные данные. По той же ссылке это также должно работать:

entity = ndb.Key(pairs=key.pairs())
person RocketDonkey    schedule 14.01.2013
comment
Хотя это работает, это бессмысленно. У него уже есть ключ, поэтому ему не нужно создавать новый. - person bossylobster; 14.01.2013
comment
@bossylobster Правда, я чувствовал себя немного странно - я все равно проголосовал за другой ответ :) - person RocketDonkey; 14.01.2013
comment
Проблема в том, что у меня есть ключ, но я должен создать новый ключ из этого ключа, потому что ключ не принят. - person voscausa; 14.01.2013