Est-il possible d'attributs de nom de façon dynamique dans un modèle App Engine?
-
27-09-2019 - |
Question
setattr
vous permet de nommer dynamiquement les attributs dans les classes Python. Je suis en train de faire quelque chose de similaire avec un App Engine Modèle:
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())
Cette compiles de code, mais quand je l'appelle model.prop1.append(key)
plus tard, je reçois cette erreur:
AttributeError: 'ListProperty' object has no attribute 'append'
Je soupçonne que c'est parce que prop1
est déclaré dans les modèles au lieu de self.prop1
, mais je ne comprends pas bien l'importance de la syntaxe.
Quelqu'un at-il accompli cela, ou que quelqu'un a une idée des différences syntaxiques?
La solution
Cette question SO:
donne un exemple de ce que vous voulez faire.
Autres conseils
Je pense que vous êtes à la recherche de la classe db.Expando
(au lieu de db.Model
).
Je ne sais pas, mais cela fonctionnerait peut-être:
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