2008-09-18 8 views
8

tengo una clase del modelo:Google App Engine: ¿cómo puedo acceder mediante programación a las propiedades de mi clase Model?

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

tengo una instancia de esta clase en p, y la cadena s contiene el valor 'first_name'. Me gustaría hacer algo como:

print p[s] 

y

p[s] = new_value 

Ambos de los cuales resultan en un TypeError.

¿Alguien sabe cómo puedo lograr lo que me gustaría?

+0

¿Qué muestra 'dir (p)'? –

Respuesta

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

Hola Jim, gracias por tu respuesta. El código anterior da como resultado un AttributeError. –

1

Probar:

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

Ver the documentation.

+0

¿Eso funcionaría? model_properties es un método de clase, no un método de instancia. –

+0

Gracias, me pusiste en el camino correcto. La respuesta exacta es p.properties() [s] .get_value_for_datastore (p) –

7

Si la clase de modelo es suficientemente inteligente, debe reconocer las formas estándar de Python de hacerlo.

Probar:

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

También hasattr está disponible.

+0

He usado GAE y getattr y setattr funcionan bien. –

+0

Dave, ¿es posible que exista una diferencia entre las clases db.Model y db.Expando? –

+0

solo pruébalo. ** setattr ** funciona bien con db.Model! –

3

Con mucho gracias a Jim, la solución exacta que estaba buscando es:

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

Para todos los demás encuestados, gracias por su ayuda. También habría esperado que la clase Model implementara la forma estándar de Python de hacer esto, pero por alguna razón, no es así.

+0

¿Por qué usar get_value_for_datastore? Si desea la misma representación que obtendría de p.first_name, no debería llamarla. –

+0

¿qué tal la segunda parte de su pregunta? ¿Qué pasa con p [s] = new_val? –

-1

p.first_name = "Nuevo nombre" p.put()

o p = Persona (nombre apellido = "Firsty", last_name = "Lasty") p.put()

Cuestiones relacionadas