SQL数据库中,两个表之间的关系表现为外键.在SQLAlchemy的模型中,也可以表现这种模型之间的关联关系.
-
class Role(db.Model):
-
__tablename__='roles'
-
id = db.Column(db.Integer,primary_key=True)
-
name = db.Column(db.String(64),unique=True)
-
users = db.relationship('User',backref='role')
-
def __repr__(self):
-
return '<Role %s>'%self.name
-
class User(db.Model):
-
__tablename__='users'
-
id=db.Column(db.Integer,primary_key=True)
-
name=db.Column(db.String(64),unique=True)
-
role_id = db.Column(db.Integer,db.ForeignKey('roles.id'))
-
def __repr__(self):
-
return '<User %s>'%self.name
我们先分析User模型中的下面这段代码:
role_id = db.Column(db.Integer,db.ForeignKey('roles.id'))
很容易理解,这是在User表中创建了一个名叫role_id的字段,并把它设置成外键,然后把外键关联成roles表中的id字段.需要注意的时这里用的roles.id,roles是我们在Role模型中定义的__tablename__. 这是SQL数据库中一般设置外键的方法.
接下来,看Role模型中的这段代码:
users = db.relationship('User',backref='role')
在标准的SQL数据中,我们设置外键时往往只需要在要设置外键的表中添加外键,而不需要在被关联表中进行任何操作.但是在SQLAlchemy建模中,我们看到还需要在被关联的模型Role中添加关系.这其实是面向对象的思想,这里的的新建了一个名叫users的属性用来表示当前角色中包含的用户列表.users被定义成一个db.relationship对象,该对象的构造函数由两部分组成:
第一部分 —— 'User'表示关系的另一端模型的名称.
第二部分 —— 是一个名叫backref的参数,叫做反向关系,我们将其设置成'role',它会像User模型中添加一个名叫做role的属性,这个属性可以替代role_id访问Role模型,但是它获取的是Role模型的对象,而非Role模型对应的id的值。
下面我们重点验证并解释第二部分讲的内容:
-
>>>from test.py import Role,User
-
>>>r=Role(id=1,name='admin')
-
>>>u=User(id=10,name='Hyman',role_id=1)
-
>>>r.users.append(u)
-
>>>print u.role
-
<Role admin>
第一行是引入我们定义的Role和User模型;第二行和第三行分别定义了一个Role和User实例;最重要的是第四行,我们将u添加到r的users(users实际上是一个list)列表中,这样我们同时也在u中添加了一个名叫做role的属性,而这属性就是我们定义的r对象.这就是所谓的可以用role代替role_id访问Role模型,但是它获取的是Role模型对象而非器对应的id的值...