Доступ к связанному объектному ключу, не выбирая объект в Механизме Приложения

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

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 () на самом деле не идет, выбирают объект. Я нахожусь неправильно на этом? У меня есть набор кода, который предполагает, что объект related_object.key () на самом деле не выбирает related_object от хранилища данных.

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

7
задан David Underhill 21 July 2010 в 20:43
поделиться

2 ответа

Вы можете найти ответ, изучая источники AppEngine.ext.db в вашей загрузке app Engine SDK Источники - и ответ нет, нет, есть Никаких специальных корпусов, как вам требуется: метод __ GET __ (линия 2887 в источниках для 1,3,0 SDK) описания Descriptor вызывается до Если .key () или что-то еще, позже будет в результате, поэтому он просто не имеет возможности сделать оптимизацию, которую вы хотели бы.

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

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

10
ответ дан 6 December 2019 в 23:06
поделиться

Не уверены на том, как ваш сайт аутентифицируется ... Но поскольку вы упомянули, что перенаправлены, я предполагаю, что через некоторую вебформу.

Когда мне пришлось что-то подобное, у меня был один объект, который заботится о WebRequests, и он позаботился о перенаправлении на страницу входа, затем продолжался на фактической странице, прежде чем отправлять ответ на потребителя объект.

Интересные биты будут в:

- (NSURLRequest *)connection:(NSURLConnection *)connection willSendRequest:(NSURLRequest *)request redirectResponse:(NSURLResponse *)redirectResponse { ... 

Я делал: (PSEDO-ISH-код)

NSURL* redirected_url = [request URL] ;
NSString* querystr = [redirected_url query] ;
if ( [self need_to_login:redirected_url] )  {
    NSString* body = [self generate_login_body_string] ;
    request = [self makeRequestLocation:@"/sign_in" Method:@"POST" Body:body] ;
}
return request ;

, где строка для тела была закодирована парами WWW-форма, что веб-форма будет генерировать в браузере. У сайта был параметр Next_URL, который имел страницу вперед, когда логин был правильным.
Позже в коде я проверяю, чтобы убедиться, что логин был успешным, но проверяя, чтобы посмотреть, был ли я перенаправлен на правильную страницу или перенаправлен на плохую страницу входа.

-121--5086391-

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

parent_key ()

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

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

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

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

Получает объект или объекты для данного ключа или ключей любой модели.

Аргументы:

Ключи Ключевой объект или список ключевых объектов .

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

1
ответ дан 6 December 2019 в 23:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: