Google Appengine: странное поведение get_by_key_name - PullRequest
3 голосов
/ 01 февраля 2010

ОБНОВЛЕНИЕ: После дальнейшего тестирования кажется, что эта проблема затрагивает все дочерние объекты в моей группе объектов. Моим корневым родителем для всех этих разных экземпляров является пользовательский тип, который является моим собственным созданием, а не встроенный пользовательский тип. После удаления 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 Ответ

3 голосов
/ 02 февраля 2010

Ваш второй комментарий правильный, AFAIK. Родительские / дочерние отношения похожи на структуру каталогов или папок в вашей файловой системе. Ваш ключ (концептуально) /parents/[parent_keyname]/logins/[login_keyname]. Поэтому, если вы попытаетесь получить /logins/[login_keyname], вы не получите свою сущность. (Не существует правила, согласно которому все Login должны быть потомками 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) (ну, имя моего метода короче, но я проясняю его. Тогда, по крайней мере, я не смогу сгенерировать ключ с неправильными отношениями родитель / ребенок.

...