SQLAlchemy模型变量是类还是对象类型?

时间:2017-04-17 05:31:40

标签: python sqlalchemy

我正在学习Flask中的Web开发。我正在使用SQLAlchemy。典型的数据库对象的结构如下:

class Role(db.Model):
    __tablename__ = 'roles'
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(64), unique=True)
    default = db.Column(db.Boolean, default=False, index=True)
    permissions = db.Column(db.Integer)
    users = db.relationship('User', backref='role', lazy='dynamic')

    def __repr__(self):
        return '<Role %r>' % self.name

我的问题是,这些是所有类变量还是对象变量?它们在__init__之外,所以看起来它们是类变量,但这似乎很奇怪。关于这个的任何指针都会很棒!谢谢!

1 个答案:

答案 0 :(得分:5)

Column中类型为Role的字段确实是类变量。但是在InstrumentedAttribute

中的角色构建期间,它们将被declarative.aqi.DeclarativeMeta.__init__()替换

这就是为什么我们定义从Base继承的元素与元类declarative.aqi.DeclarativeMetadeclarative_base()的返回值)

的原因

InstrumentedAttribute是一个数据描述符,它定义了应用于实例字典的__get____set__。因此,我们可以使用它们通过实例进行操作。

在以下示例中,r.name是数据描述符,r.name = 'hello'等同于Role.name.__set__(r, 'hello') - &gt; r.__dict__['name'] = 'hello'

r = Role()
r.name = 'hello'