Python — чтение с ключом в движке приложений

#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) .