Frage

setattr können Sie dynamisch Attribute in Python Klassen nennen. Ich versuche, etwas ähnliches mit einem App Engine Modell zu tun:

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())

Dieser Code kompiliert, aber wenn ich model.prop1.append(key) rufen Sie später an, ich diesen Fehler:

AttributeError: 'ListProperty' object has no attribute 'append'

Ich vermute, das liegt daran, dass prop1 in Modellen statt self.prop1 deklariert wird, aber ich verstehe nicht ganz die Bedeutung der Syntax.

Hat jemand dies erreicht, oder hat jemand einen Einblick in die syntaktischen Unterschiede?

War es hilfreich?

Andere Tipps

Ich glaube, Sie suchen die db.Expando Klasse (statt db.Model).

Nicht sicher aber würde diese Arbeit vielleicht:

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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top