É possível nomear dinamicamente atributos em um modelo de mecanismo de aplicativos?
-
27-09-2019 - |
Pergunta
setattr
permite que você nomeie dinamicamente atributos nas classes Python. Estou tentando fazer algo semelhante com um modelo de mecanismo de aplicativo:
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 compila, mas quando eu ligo model.prop1.append(key)
Mais tarde, recebo este erro:
AttributeError: 'ListProperty' object has no attribute 'append'
Eu suspeito que isso é porque prop1
é declarado em modelos em vez de self.prop1
, mas não entendo completamente o significado da sintaxe.
Alguém conseguiu isso ou alguém tem alguma visão das diferenças sintáticas?
Solução
Isso é uma pergunta:
Dá um exemplo do que você deseja fazer.
Outras dicas
Eu acho que você está procurando o db.Expando
classe (em vez de db.Model
).
Não tenho certeza, mas isso funcionaria talvez:
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
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow