Google Appengine: странное поведение get_by_key_name
ОБНОВЛЕНИЕ: После дальнейшего тестирования кажется, что эта проблема затрагивает все дочерние объекты в моей группе объектов. Моим корневым родителем для всех этих экземпляров является пользовательский тип, который является моим собственным созданием, а не встроенный пользовательский тип. После удаления parent=user из конструктора дочернего Kind, get_by_key_name работает как положено. Однако я хотел бы иметь возможность использовать функциональность Entity Group вместе с определенными ключами, если это возможно.
- Привет, я пытаюсь использовать определенные имена ключей для ускорения запросов в моем проекте GAE.
Тем не менее, я столкнулся с странной проблемой, когда я не могу получить ключ. Этот код, похоже, не работает:
for l in Logins.all().fetch():
print Login.get_by_key_name(l.key().name())
Некоторые заметки:
- Я тестировал только в SDK
l.key (). name () Возвращает строку имени ключа, указанную в сущности, когда я смотрю в хранилище данных. Я могу скопировать и вставить строку из истории данных и использовать ее в качестве аргумента для get_by_key_name(), и это тоже не работает.
все имена ключей для вида Login имеют префикс "l" (т. е. строчные буквы "L"), в остальном все строчные и могут содержать подчеркивания или тире, но не более 500 байтов.
Другие добрые серчи вроде этой работы.
- Ключ - это интерполяция двух свойств типа Login, и я могу просто получить объекты, используя обычные методы.filter().
- "Родителем" для экземпляров является класс User. (упоминание на случай, если это имеет какое-то отношение к тому, как я должен получить)
Поэтому я должен спросить, есть ли очевидные причины, почему это не будет работать? Известны ли проблемы с поиском по ключевым словам с использованием SDK?
1 ответ
Ваш второй комментарий правильный, AFAIK. Родительские / дочерние отношения похожи на структуру каталогов или папок в вашей файловой системе. Ваш ключ (концептуально) /parents/[parent_keyname]/logins/[login_keyname]
, Так что если вы попытаетесь получить /logins/[login_keyname]
Вы не получите свою сущность. (Нет правила, что все Login
s должны быть детьми Parent
s; `get_by_key_name() нужно каждый раз рассказывать о родительских отношениях.)
В моем собственном коде я сам собрал ключи Key.from_path()
, Я использую методы класса, например Login.key_for_name(some_parent, some_name)
а также Login.get_by_key_name_for_parent(some_parent, some_name)
(ну, у меня имя метода короче, но просто проясняю. Тогда, по крайней мере, я не смогу сгенерировать ключ с неправильными отношениями родитель / потомок.