Доступ к ключу связанного объекта без извлечения объекта в App Engine - PullRequest
7 голосов
/ 16 января 2010

В общем, лучше сделать один запрос против множества запросов для данного объекта. Допустим, у меня есть куча объектов «сын», каждый из которых имеет «отца». Я получаю все объекты «сына»:

sons = Son.all()

Тогда я бы хотел получить всех отцов для этой группы сыновей. Я делаю:

father_keys = {}
for son in sons:
    father_keys.setdefault(son.father.key(), None)

Тогда я могу сделать:

fathers = Father.get(father_keys.keys())

Теперь предполагается, что son.father.key () на самом деле не получает объект. Я ошибаюсь в этом? У меня есть набор кода, который предполагает, что object.related_object.key () фактически не извлекает related_object из хранилища данных.

Я правильно делаю?

Ответы [ 2 ]

10 голосов
/ 16 января 2010

Вы можете найти ответ, изучив источники appengine.ext.db в своей загрузке источников App Engine SDK - и ответ - нет, нет специального регистра, как вам требуется : метод __get__ (строка 2887 в источниках для SDK 1.3.0) дескриптора ReferenceProperty вызывается до , зная, будет ли позднее .key() или что-либо еще позднее вызываться для результата, так что у него просто нет возможности провести нужную оптимизацию.

Однако , см. Строку 2929: метод get_value_for_datastore делает именно то, что вы хотите!

В частности, вместо son.father.key() используйте Son.father.get_value_for_datastore(son), и в результате вы должны быть намного счастливее; -).

1 голос
/ 16 января 2010

Я бы предпочел перебрать сыновей и получить ключи родителей, используя son.parent_key().

parent_key ()

Возвращает ключ родительского объекта этого экземпляра или None, если этот экземпляр не имеет родителя.

Поскольку весь путь сохраняется в ключе экземпляра , теоретически , нет необходимости снова нажимать на базу данных, чтобы получить ключ родителя.

После этого можно получить экземпляры всех родителей одновременно , используя db.get () .

получить (ключи)

Получает сущность или сущности для данного ключа или ключей любой модели.

Аргументы:

ключи Объект Key или список объектов Key .

Если указан один ключ, возвращаемое значение является экземпляром соответствующий класс модели, или нет, если нет сущность существует с данным ключом. Если список ключей предоставлен, возврат значение соответствует списку моделей экземпляры, со значениями None, когда нет сущность существует для соответствующего ключа.

...