1

setattr können Sie Attribute in Python-Klassen dynamisch benennen. Ich versuche, etwas ähnliches mit einem App Engine Modell zu tun:Ist es möglich, Attribute in einem App Engine-Modell dynamisch zu benennen?

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) später anrufen, bekomme ich diesen Fehler:

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

Ich vermute, das liegt daran, prop1 wird in Modellen anstelle von self.prop1 deklariert, aber ich verstehe die Bedeutung der Syntax nicht vollständig.

Hat jemand dies erreicht oder hat jemand einen Einblick in syntaktische Unterschiede?

+0

Haben Sie eigentlich eine dynamisch hinzugefügt Festigkeitsklasse benötigen, oder ist ein expando mit setattr, was Sie suchen? –

Antwort

5

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

1

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 
Verwandte Themen