Is it possible to dynamically name attributes in an App Engine Model?
-
27-09-2019 - |
Question
setattr
allows you to dynamically name attributes in Python classes. I'm trying to do something similar with an App Engine Model:
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())
This code compiles, but when I call model.prop1.append(key)
later on, I get this error:
AttributeError: 'ListProperty' object has no attribute 'append'
I suspect this is because prop1
is declared in models instead of self.prop1
, but I don't fully understand the syntax's significance.
Has anyone accomplished this, or does anyone have any insight into syntactic differences?
Solution
This SO question:
gives an example of what you want to do.
OTHER TIPS
I think you're looking for the db.Expando
class (instead of db.Model
).
Not sure but would this work maybe:
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
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow