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?

Foi útil?

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
scroll top