2008-09-18 20 views
8

J'ai une classe de modèle:Google App Engine: comment accéder par programme aux propriétés de ma classe Model?

class Person(db.Model): 
    first_name = db.StringProperty(required=True) 
    last_name = db.StringProperty(required=True) 

J'ai une instance de cette classe dans p et chaîne s contient la valeur 'first_name'. Je voudrais faire quelque chose comme:

print p[s] 

et

p[s] = new_value 

qui deux résultat dans un TypeError.

Est-ce que quelqu'un sait comment je peux réaliser ce que je voudrais?

+0

Que montre 'dir (p)'? –

Répondre

1
getattr(p, s) 
setattr(p, s, new_value) 
+0

Hey Jim, merci pour votre réponse. Le code ci-dessus entraîne une AttributeError. –

1

Essayez:

p.model_properties()[s].get_value_for_datastore(p) 

Voir the documentation.

+0

Est-ce que ça marcherait même? model_properties est une méthode de classe, pas une méthode d'instance. –

+0

Merci, vous m'avez mis sur le bon chemin. La réponse exacte est p.properties() [s] .get_value_for_datastore (p) –

7

Si la classe de modèle est suffisamment intelligente, elle doit reconnaître les méthodes Python standard pour ce faire.

Essayez:

getattr(p, s) 
setattr(p, s, new_value) 

Il y a aussi hasattr disponible.

+0

J'ai utilisé GAE et getattr et setattr fonctionnent correctement. –

+0

Dave, est-il possible qu'il y ait une différence entre les classes db.Model et db.Expando? –

+0

il suffit de l'essayer. ** setattr ** fonctionne bien avec db.Model! –

3

Avec beaucoup grâce à Jim, la solution exacte que je cherchais est:

p.properties()[s].get_value_for_datastore(p) 

Pour tous les autres répondants, je vous remercie pour votre aide. Je m'attendais aussi à ce que la classe Model implémente la manière standard de python de le faire, mais pour une raison quelconque, ce n'est pas le cas.

+0

Pourquoi utiliser get_value_for_datastore? Si vous voulez la même représentation que vous obtiendriez de p.first_name, vous ne devriez pas appeler cela. –

+0

qu'en est-il de la deuxième partie de votre question? Qu'en est-il de p [s] = new_val? –

-1

p.first_name = "Nouveau prénom" p.put()

ou p = personne (prenom = "Firsty", last_name = "Lasty") p.put()