Можно ли динамически назвать атрибуты в модели приложений?
-
27-09-2019 - |
Вопрос
setattr
Позволяет динамически называть атрибуты в классах Python. Я пытаюсь сделать что-то похожее с помощью модели приложений:
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())
Этот код компилирует, но когда я звоню model.prop1.append(key)
Позже я получаю эту ошибку:
AttributeError: 'ListProperty' object has no attribute 'append'
Я подозреваю, что это потому, что prop1
объявляется в моделях вместо self.prop1
, но я не полностью понимаю значение синтаксиса.
Кто-нибудь достиг этого, или у кого-нибудь есть какое-либо понимание синтаксических различий?
Решение
Это так вопрос:
Придает пример того, что вы хотите сделать.
Другие советы
Я думаю, что вы ищете db.Expando
класс (вместо db.Model
).
Не уверен, но бы эта работа может быть:
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
Не связан с StackOverflow