#google-app-engine
# #google-app-engine
Вопрос:
У меня есть программа на Python в Google App Engine
При нахождении объекта в хранилище данных, когда у меня есть ключ в виде строки, как я могу выполнить прямое чтение. Ниже приведен мой код, который выполняет цикл, не очень хорошо…..
class Opportunity(db.Model):
customer = db.ReferenceProperty(Customer,collection_name='opportunitys')
BNusername = db.StringProperty()
opportunity_no = db.StringProperty()
# etc etc etc.....
#BnPresets holds the object key as a string
opportunitys = Opportunity.all()
opportunitys.filter('BNusername =',BnPresets.myusername)
for oprec in opportunitys:
if str(oprec.key()) == BnPresets.recordkey:
opportunity = oprec
# I have the object here and can process etc etc
Ответ №1:
Вы можете создать экземпляр db.Key
из строки, передав его непосредственно конструктору:
opportunity_key = db.Key(BnPresets.recordkey)
Как только у вас это будет, просто db.get
получите объект, идентифицированный этим ключом:
opportunity = db.get(opportunity_key)
Я предполагаю (посмотрев на используемый вами запрос), что вы также хотите проверить имя пользователя полученного вами объекта:
if opportunity.BNusername == BnPresets.myusername
process_opportunity(opportunity)
Это должно быть в значительной степени так. Суть в том, что вы должны сначала использовать ключ, поскольку он однозначно идентифицирует вашу сущность, а не запрашивать какое-либо другое свойство и перебирать результаты.
Комментарии:
1. Я предполагаю, что opportunity = db.get(opportunity_key) находится в разделе класса Opportunity(db.Model): . Это означало бы, что я всегда использую одну и ту же переменную для удержания КЛЮЧА при выполнении db.get. Я также предполагаю, что код opportunitys = Opportunity.all() и т. Д. Будет работать, когда я хочу получить несколько объектов. Правильно ли я это делаю?
2. Обратите внимание, что db.get также будет работать непосредственно со строковым представлением ключа. Вы можете пропустить первый шаг и просто выполнить opportunity = db.get(BnPresets.recordkey) .