2009-11-11 4 views
0

Je voudrais mentionner d'avance que je suis novice en python et avec cela à la plate-forme python de GAE. J'ai trouvé cette erreur/faute très étrange quand j'essaye d'obtenir une entité en utilisant son ID de clé ... Voici ce que je fais,Etrange erreur dans le moteur de l'application google

J'interroge le modèle d'entité de banque de données UserDetails pour la clé correspondant à l'utilisateur nom récupéré de l'interface utilisateur.

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() 

Ensuite, en utilisant le src_key obtenu je tente d'obtenir l'entité correspondant à la même.

accounts = UserDetails.get_by_id(src_key) 

Maintenant ici lorsque je tente d'accéder aux propriétés des comptes à l'aide self.response.out.write(accounts.user_name), je reçois une erreur AttributeError: 'list' object has no attribute 'user_name'. Pensant que les comptes étaient en fait une liste, j'ai essayé d'obtenir le premier élément en utilisant accounts[0] Maintenant, je reçois list out of bound error.

Lorsque j'essaye de coder en dur la valeur de src_key, cela fonctionne très bien mais, quand je passe la valeur à la même méthode, j'obtiens ces erreurs. Je ne comprends pas pourquoi GAE se comporte ainsi dans l'environnement de production et l'environnement de développement. Ai-je manqué quelques informations sur ce comportement?

EDIT: l'ajout de trace de la pile,

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

Nous avons besoin de la trace complète de la pile. L'exception que vous affichez ne peut pas apparaître dans le code que vous avez collé. –

+0

Ajout de la trace de pile comme demandé. – Arun

Répondre

1

Vous obtenez cette erreur, car 'comptes' est une liste plutôt que d'une seule instance. En fonction de votre code, je ne vois pas pourquoi ce serait le cas, mais essayer de faire ce qui suit:

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

Il n'y a aucune raison d'appeler .fetch() lorsque vous avez seulement besoin d'un objet, et il n'y a pas non plus raison d'extraire l'identifiant, juste pour le passer à .get_by_id. En fait, si l'extrait que vous avez affiché est tout ce que vous faites, plus simple et plus rapide serait:

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

Si 'accounts' était une liste comme vous l'avez suggéré alors je pense que je ne devrais pas obtenir la liste hors erreur liée quand j'appelle' accounts [0] 'juste sous' accounts = UserDetails.get_by_id (src_key) ', mais je eu comme je l'ai mentionné dans ma question. – Arun

+0

Si les comptes sont une liste vide, une erreur hors limite est exactement ce que vous obtiendriez pour 'accounts [0]'. Si ce n'était pas une liste, vous obtiendriez une erreur _different_ en essayant de l'indexer. –

Questions connexes