Ist es möglich, dynamisch Namen Attribute in einer App Engine Modell?
-
27-09-2019 - |
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?
Lösung
Diese Frage SO:
gibt ein Beispiel von dem, was Sie tun mögen.
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