В целом лучше сделать единый запрос по сравнению со многими запросами для данного объекта. Скажем, у меня есть набор объектов 'сына' каждый с 'родительским элементом'. Я получаю все объекты 'сына':
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 от хранилища данных.
Я делаю это правильно?
Вы можете найти ответ, изучая источники 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 (сын)
, и вы должны быть много результат;-).
Не уверены на том, как ваш сайт аутентифицируется ... Но поскольку вы упомянули, что перенаправлены, я предполагаю, что через некоторую вебформу.
Когда мне пришлось что-то подобное, у меня был один объект, который заботится о 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, который имел страницу вперед, когда логин был правильным.
Позже в коде я проверяю, чтобы убедиться, что логин был успешным, но проверяя, чтобы посмотреть, был ли я перенаправлен на правильную страницу или перенаправлен на плохую страницу входа.
Я бы предпочел петлю через сыновья и получить ключевые ключи родителей, используя SON.Parent_key ()
.
parent_key ()
возвращает ключ родительского объекта этого экземпляра или нет, если Этот экземпляр не имеет родителей.
Поскольку весь путь сохранен в клавише экземпляра , Теоретически , нет необходимости снова ударить в базу данных, чтобы получить ключ родителя.
После этого можно получить все экземпляры родителей сразу , используя db.get () .
Получить (ключи)
Получает объект или объекты для данного ключа или ключей любой модели.
Аргументы:
Ключи Ключевой объект или список ключевых объектов .
Если приведен один ключ, возвращаемое значение является экземпляром подходящий класс модели, или нет, если нет Сущность существует с данным ключом. Если Список ключей предоставляется, возврат Значение является соответствующим списком модели экземпляры, без значений, когда нет Сущность существует для соответствующего ключа.