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?

Était-ce utile?

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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top