2009-11-11 2 views
0

Я хотел бы упомянуть перед собой, что я новичок в python и с этим для платформы Python GAE. Я обнаружил эту очень странную ошибку/ошибку, когда пытаюсь получить сущность, используя ее идентификатор ключа ... Вот что я делаю,Странная ошибка в движке google

Я запрашиваю модель объекта хранилища UserDetails для ключа, соответствующего пользователю имя, полученное из пользовательского интерфейса.

src_key_str = db.GqlQuery('SELECT __key__ FROM UserDetails WHERE user_name = :uname', uname = src_username).fetch(1) 
for itr1 in src_key_str: 
      src_key = itr1.id_or_name() 

Затем с помощью src_key получается я стараюсь, чтобы получить объект, соответствующий тем же самым.

accounts = UserDetails.get_by_id(src_key) 

Теперь здесь, когда я пытаюсь получить доступ к свойствам счетов с помощью self.response.out.write(accounts.user_name), я получаю сообщение об ошибке AttributeError: 'list' object has no attribute 'user_name'. Думая, что учетные записи были фактически списком, я попытался получить первый элемент, используя accounts[0] Теперь я получаю list out of bound error.

Когда я пытаюсь жестко кодировать значение src_key, он работает нормально, но когда передаю значение одному методу, я получаю эти ошибки. Я не понимаю, почему GAE ведет себя так в производственной среде и среде разработки. Мне не хватает информации об этом поведении?

EDIT: добавление трассировки стека,

Traceback (most recent call last): 
    File "/base/python_lib/versions/1/google/appengine/ext/webapp/__init__.py", line 507, in __call__ 
    handler.get(*groups) 
    File "/base/data/home/apps/bulkloader160by2/1-5.337673425692960489/new_main.py", line 93, in get 
    self.response.out.write(accounts.user_name) 
AttributeError: 'list' object has no attribute 'user_name' 
+0

Нам нужна полная трассировка стека. Исключение, которое вы показываете, не может произойти в коде, который вы вставили. –

+0

Добавлена ​​трассировка стека в соответствии с запросом. – Arun

ответ

1

Вы получаете эту ошибку, потому что «счета» список, а не единичный случай. На основе кода, я не могу понять, почему это было бы так, но попробуйте сделать следующее:

src_key = db.GqlQuery('SELECT __key__ FROM UserDetails WHERE user_name = :uname', uname = src_username).get() 
if src_key: 
    account = UserDetails.get(src_key) 

Там нет оснований называть .fetch(), когда требуется только один объект, и есть также нет причина извлечь идентификатор, просто чтобы передать его .get_by_id. Фактически, если фрагмент, который вы показали, это все, что вы делаете, проще и быстрее будет:

account = db.GqlQuery('SELECT * FROM UserDetails WHERE user_name = :uname', uname = src_username).get() 
+0

Если «учетные записи» были списком, как вы предложили, я думаю, что мне не следует получать список из связанной ошибки, когда я вызываю 'accounts [0]' прямо под 'accounts = UserDetails.get_by_id (src_key)', но я получил это, как я уже упоминал в своем вопросе. – Arun

+0

Если учетные записи являются пустым списком, ошибка, связанная с ошибкой, является именно тем, что вы получили бы для «учетных записей [0]». Если это не список, вы получите ошибку _different_, пытающуюся его проиндексировать. –

Смежные вопросы