Получение списка дочерних объектов в App Engine с использованием get_by_key_name (Python) - PullRequest
2 голосов
/ 23 октября 2009

Мои приключения с группами сущностей продолжаются после слегка смущающего начала (см. При некоторых обстоятельствах вызов App Engine get_by_key_name с использованием существующего имени_ключа возвращает None ).

Теперь я вижу, что не могу сделать обычный вызов get_by_key_name для списка сущностей для дочерних сущностей, которые имеют более одной родительской сущности. Как говорят в Документах модели,

Несколько объектов, запрошенных одним (get_by_key_name) вызов должен иметь все тот же родитель.

У меня появилась привычка делать что-то вроде следующего:

# Model just has the basic properties
entities = Model.get_by_key_name(key_names)
# ContentModel has all the text and blob properties for Model
content_entities = ContentModel.get_by_key_name(content_key_names)

for entity, content_entity in zip(entities, content_entities):
 # do some stuff

Теперь, когда сущности ContentModel являются дочерними для сущностей модели, это не будет работать из-за требования одного родителя.

Простой способ включить описанный выше сценарий с группами объектов - это возможность передать список родителей на вызов get_by_key_name, но я предполагаю, что есть веская причина, почему это в настоящее время невозможно. Я задаюсь вопросом, является ли это жестким правилом (так как такой вызов не может работать вообще) или модуль db мог бы быть изменен так, чтобы этот тип вызова работал, даже если бы это означало большую загрузку ЦП расходы.

Мне бы тоже очень хотелось посмотреть, как другие решают такую ​​задачу. Я могу придумать несколько способов справиться с этим, например, использовать GQL-запросы, но ни один из них не может приблизиться к производительности вызова get_by_key_name.

Ответы [ 2 ]

4 голосов
/ 23 октября 2009

Просто создайте список ключей и получите его.

entities = Model.get_by_key_name(key_names)
content_keys = [db.Key.from_path('Model', name, 'ContentModel', name) 
                for name in key_names]
content_entities = ContentModel.get(content_keys)

Обратите внимание, что я предполагаю, что key_name для каждого объекта ContentModel совпадает с его родительской моделью. (Для отношения 1: 1 имеет смысл повторно использовать имя_ключа.)

1 голос
/ 23 октября 2009

Мне стыдно сказать, что ограничение («должно быть в той же группе сущностей») на самом деле больше не применяется в этом случае. Пожалуйста, не стесняйтесь файл ошибка документации!

В любом случае, get_by_key_name является только синтаксическим сахаром для get, как иллюстрирует Билл Кац. Вы можете пойти еще дальше и использовать db.get в списке ключей, чтобы получить все сразу - db.get не заботится о типе модели.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...