E 'possibile attributi di nomi in modo dinamico in un Modello del motore App?
-
27-09-2019 - |
Domanda
setattr
permette di assegnare un nome dinamicamente gli attributi di classi Python. Io sto cercando di fare qualcosa di simile con un App Engine Modello:
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())
Questo codice compila, ma quando chiamo model.prop1.append(key)
più tardi, ottengo questo errore:
AttributeError: 'ListProperty' object has no attribute 'append'
ho il sospetto che questo è perché prop1
è dichiarata in modelli anziché self.prop1
, ma non comprendere appieno il significato della sintassi.
Qualcuno ha compiuto questo, o qualcuno ha qualche comprensione delle differenze sintattiche?
Soluzione
Questa domanda SO:
dà un esempio di ciò che si vuole fare.
Altri suggerimenti
credo che tu stia cercando il href="http://code.google.com/appengine/docs/python/datastore/expandoclass.html" rel="nofollow"> db.Expando
classe db.Model).
Non sono sicuro, ma sarebbe questo lavoro forse:
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