Можно ли динамически назвать атрибуты в модели приложений?

StackOverflow https://stackoverflow.com/questions/4252584

Вопрос

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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top