¿Es posible atributos de nombre de forma dinámica en un modelo de App Engine?
-
27-09-2019 - |
Pregunta
setattr
le permite nombrar dinámicamente atributos en las clases de Python. Estoy tratando de hacer algo similar con un motor Modelo Aplicación:
class MyModel(db.Model):
def __init__(self, *args, **kwargs):
super(MyModel, self).__init__(*args, **kwargs)
# Doesn't fully work
setatr(self, 'prop1', db.ListProperty(db.Key))
setatr(self, 'prop2', db.StringListProperty())
# Works fully
# prop1 = db.ListProperty(db.Key))
# prop2 = db.StringListProperty())
Este código se compila, pero cuando llamo model.prop1.append(key)
más adelante, me sale este error:
AttributeError: 'ListProperty' object has no attribute 'append'
sospecho que esto se debe a que prop1
se declara en modelos en vez de self.prop1
, pero no entienden completamente la importancia de la sintaxis.
¿Alguien ha logrado esto, o ¿alguien tiene alguna idea de las diferencias sintácticas?
Solución
Esta pregunta SO:
da un ejemplo de lo que quiere hacer.
Otros consejos
creo que estás en busca de la href="http://code.google.com/appengine/docs/python/datastore/expandoclass.html" rel="nofollow"> db.Expando
clase db.Model).
No es seguro, pero tal vez funcionaría esto:
class MyModel(db.Model):
@classmethod
def new(cls, *args, **kwargs):
setattr(cls, 'props1', db.ListProperty(db.Key))
setattr(cls, 'props2', db.StringListProperty())
mymodel = cls(*args, **kwargs)
delattr(cls, 'props1')
delattr(cls, 'props2')
return mymodel